部分博客(多线程——继承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. LV在系统重启后不能自动激活(boot.lvm&after.loca)

    同类相关文章:http://blog.csdn.net/laven54/article/details/9121661 最近发现suse11sp2的系统解决了异常死机的问题之后,又引入了另外的问题,比 ...

  2. Android入门第六篇之ListView (一)

    本文来自http://blog.csdn.net/hellogv/ ListView是一个经经常使用到的控件,ListView里面的每一个子项Item能够使一个字符串,也能够是一个组合控件.先说说Li ...

  3. 通过Type.InvokeMethod实现方法的重载

    版本:.NET Framework 3.5 先来一个反射调用方法的例子: using System; using System.Reflection; class Example { static v ...

  4. Mac OS提示# 14:自己定义文件图标

    本教程的其余部分再一次错过了方法,和一些使用提示,做一些额外的,我们希望对大家有帮助.  自己定义图标      对于Mac OSX用户来说,Dashboard,Dock栏,壁纸以及各种键盘触摸板的快 ...

  5. 如何下载和编译Android4.0内核源代码goldfish(图像)

    如何下载Android4.0源代码.请参阅我的博客文章中有(同样是图文教程): http://blog.csdn.net/flydream0/article/details/7036156 怎样编译A ...

  6. 《转》div 中间固定 左右自适应实现

    <转自>:http://www.w3cplus.com/css/layout-column-three 对于我来说,这是一种很少碰到的布局方法,不知道大家有何体会,那么下面我们一起来看这种 ...

  7. Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)

    SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.例如:向数据库中插入100万条数 ...

  8. 那些年我们装过的数据库---盘点sqlserver2008安装时遇到的各种的问题(持续更新中)

    给自己安过sqlServer2008,也给好多同学安过sqlServer2008,期间遇到了好多不同的另人心烦的问题,在这里整理一下,(涉及到的部分方法是在网上找的,有些也没试过,仅仅是在这里整理一下 ...

  9. 怎么获取Spring的ApplicationContext

    在 WEB 开发中,可能会非常少须要显示的获得 ApplicationContext 来得到由 Spring 进行管理的某些 Bean, 今天我就遇到了,在这里和大家分享一下, WEB 开发中,怎么获 ...

  10. DS Scheduler 0.7 发布,Linux 调度系统 - 开源中国社区

    DS Scheduler 0.7 发布,Linux 调度系统 - 开源中国社区 DS Scheduler 0.7 发布,Linux 调度系统