部分博客(多线程——继承Thread类)介绍了java多线程的第一种实现方法——继承Thread类。这篇博客介绍另外一种方法——实现Runnable接口,并实现run方法。

还用上篇博客的样例。如今用另外一种方法实现。详细代码例如以下:

public class Test2 implements Runnable{

	private String word;

	public Test2(String word){
this.word = word;
} @Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": 開始运行!" );
try {
//如果处理须要2秒
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ": 正在处理!" );
System.out.println(Thread.currentThread().getName() + ": " + word + "长度为:" + word.length());
} public static void main(String [] args ) {
String [] words = {"first","second","world","thread"};
for(String word : words){
Test2 test = new Test2(word);
Thread thread = new Thread(test);
thread.start();
}
}
}

运行结果例如以下:

Thread-0: 開始运行!

Thread-3: 開始运行!

Thread-2: 開始运行!

Thread-1: 開始运行!

Thread-1: 正在处理。

Thread-1: second长度为:6

Thread-3: 正在处理!

Thread-3: thread长度为:6

Thread-2: 正在处理。

Thread-2: world长度为:5

Thread-0: 正在处理!

Thread-0: first长度为:5

我们看到,使用Runnable,相同实现了功能。事实上。凡是能用继承Thread实现的,统统能够使用Runnable来实现。

由于Thread类相同实现了Runnable接口。我们使用继承Thread类来实现多线程仅仅是Runnable的一个特例。

上篇博客我们还提到了继承Thread类无法实现资源共享,而Runnable能够,那么,如今就让我们看看怎样使用Runnable来实现资源共享。

换一个样例,如果火车站分三个窗体卖票,共卖100张票。

让我们用Runnable来实现一个这个样例。详细代码例如以下:

public class Test3 implements Runnable{
    
    private Integer ticket = 100;
    
    public void run() {
        System.out.println(Thread.currentThread().getName() + ": 開始卖票!" );
        while(ticket > 0){
            try {
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":卖掉 " + ticket-- + " 号票 ");
        }
    }
    
    public static void main(String [] args ) {
        Test3 test = new Test3();
        Thread t1=new Thread(test,"1号窗体");
        Thread t2=new Thread(test,"2号窗体");
        Thread t3=new Thread(test,"3号窗体");
        t1.start();
        t2.start();
        t3.start();
    }
}

运行结果例如以下:

1号窗体: 開始卖票!
2号窗体: 開始卖票! 3号窗体: 開始卖票。
2号窗体:卖掉 100 号票
1号窗体:卖掉 99 号票
3号窗体:卖掉 98 号票
2号窗体:卖掉 97 号票
1号窗体:卖掉 96 号票
3号窗体:卖掉 95 号票
2号窗体:卖掉 94 号票
1号窗体:卖掉 93 号票
3号窗体:卖掉 92 号票
2号窗体:卖掉 91 号票 ………………………… ………………………… 1号窗体:卖掉 10 号票
2号窗体:卖掉 9 号票
3号窗体:卖掉 8 号票
1号窗体:卖掉 7 号票
2号窗体:卖掉 6 号票
3号窗体:卖掉 5 号票
1号窗体:卖掉 4 号票
2号窗体:卖掉 3 号票
3号窗体:卖掉 2 号票
1号窗体:卖掉 1 号票
2号窗体:卖掉 0 号票
3号窗体:卖掉 -1 号票

从结果上来看。确实实现了资源共享,三个窗体确实操作的都是那100张票。但细致一看,结果还是有问题的。问题例如以下:

1号窗体:卖掉 1 号票

2号窗体:卖掉 0 号票

3号窗体:卖掉 -1 号票

我们运行的是while(ticket > 0)代码,怎么还会出现0、-1 呢?
这就是数据同步的问题。

事实上,凡是涉及到资源共享的,数据同步是必需要考虑的。

本篇博客重点说明资源能够共享,至于线程安全的问题。有兴趣的朋友能够继续完好。

使用Runnable实现多线程就讲到这里。下篇博客继续介绍第三种实现多线程的方法——实现Callable接口。

版权声明:本文博主原创文章,博客,未经同意不得转载。

多线程——达到Runnable介面的更多相关文章

  1. android 多线程Thread,Runnable,Handler,AsyncTask

    先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...

  2. java 多线程--- Thread Runnable Executors

    java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...

  3. Runnable,Thread实现多线程以及Runnable的同步资源共享

    (一) 实现多线程有两种方式 (1) 继承Thread类,重写run()方法,如以下例子 class MyThread extends Thread{ public void run(){ // } ...

  4. [java多线程] - Thread&Runnable运用

    负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...

  5. 多线程之 Runnable接口

    一.多线程实现的第二种方式 1.定义类,实现Runnable接口 2.重写接口中的run方法,要在run方法中定义线程要执行的任务 public class MyRunnableImpl implem ...

  6. 多线程——实现Runnable接口实现一个多线程

    实现Runnable接口实现一个多线程 Runnable接口源码: package java.lang; //Runnable接口源码只有一个run方法 public interface Runnab ...

  7. java多线程--实现Runnable接口方式

    因为java类只能继承一个类可以实现多个接口的特性,所以一般情况下不推荐使用继承Thread类实现多线程,下面是实现Runnable接口方式的简单多线程代码 package text; /** * 多 ...

  8. 多线程中Runnable 和Thread关于synchronized的疑点

    学java时和同学碰到的一道题: 转自https://blog.csdn.net/qq_40857349/article/details/102809100 某公司组织年会,会议入场时有两个入口,在入 ...

  9. 第39天学习打卡(多线程 Thread Runnable 初始并发问题 Callable )

    多线程详解 01线程简介 Process与Thread 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程则是执行程序的一次执行过程,它是一个动态的概念.是系统资源分配的 ...

随机推荐

  1. Mina2 研究总结

    一.Mina框架. Mina的框架大概是这么个样子: 底层由Java 的NIO 1.0实现 核心架构应该是这样: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZX ...

  2. 无法安装vmware tools的解决方PLEASE WAIT! VMware Tools is currently being installed on your system. Dependin

    VMware安装unbuntu 12.04 LTS时,当你使用VMware的Easy Mode安装时,提示须要安装VMware Tools,屏幕会出现下方的文字: installed unbuntu ...

  3. ibatis新手入门

    ibatis 是什么 iBATIS是以SQL为中心的持久化层框架. 能支持懒载入.关联查询.继承等特性. iBATIS不同于一般的OR映射框架. OR映射框架,将数据库表.字段等映射到类.属性,那是一 ...

  4. UVa 11233 - Deli Deli

    题目:求所给单词的负数形式. 分析:模拟. 直接按章题意分情况求解就可以. 说明:按语法也能够(⊙_⊙). #include <iostream> #include <cstdlib ...

  5. setStyleSheet来设定窗口部件的样式

    使用setStyleSheet来设置图形界面的外观:QT Style Sheets是一个很有利的工具,允许定制窗口的外观,此外还可以用子类QStyle来完成,他的语法很大比重来源于html的CSS,但 ...

  6. Java编码浅析(注意区分三个概念)(转)

    编码: (1)外部资源的字符集-----没有读入jvm中的数据都是外部资源 (2)jvm中数据的字符集-----都是unicode (1)和(2)之间发生交互时,如果不指定编码,则使用JVM平台默认字 ...

  7. 利用jquery+iframe做一个ajax上传效果

    以下是自学it网--中级班上课笔记 网址:www.zixue.it html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...

  8. 自学PHP 环境搭建

    自学PHP之环境搭建 一..首先 安装 phpStudy2013.exe 程序集成包  安装完可能端口被占用 需要手动设置 然后打开http://localhost:8080/phpMyAdmin/ ...

  9. 腾讯文学动作密集 疑为手Q发力移动阅读铺路

        移动互联网的门票之争并未结束,百度收购91无线,阿里投资新浪微博.UC浏览器,网易推易信.云音乐等等,都是互联网巨头争夺移动互联网门票的最佳案例.不过,上述任何巨头都不可忽视腾讯这个“狠角色” ...

  10. Android开源项目大全 - 工具类

    主要包括那些不错的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他. 一.依赖注入DI 通过依赖注入减少Vie ...