部分博客(多线程——继承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. vim Diff,Easy,Read-Only 的区别

    我用的是vim 7.4,在windows上面安装完 vim 之后会出现不同的vim图标,gVim ,vim gVim 是在windows下的Gui图形用户界面的的 vim (GUI Vim),支持wi ...

  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. Contact类解析

    Contact类 public static class Contacts implements BaseColumns, ContactsColumns, ContactOptionsColumns ...

  4. [Android学习笔记]PopupWindow的使用

    什么时候使用PopupWindow? 当业务需求的交互形式需要在当前页弹出一个简单可选项UI与用户进行交互时,可使用PopupWindow完成此功能开发 Android Dev API Doc Pop ...

  5. heapq

    heapq-Guest-ChinaUnix博客 假设你需要维护一个列表,这个列表不断有新的元素加入,你需要在任何时候很方便的得到列表中的最大(小)值,因此要求列表始终处于排序完毕状态,怎么办呢 最简单 ...

  6. 应届GIS硕士求职经验总结

    记录一下作为一个GIS应届毕业生在帝都找工作的历程吧,之后的经历可能丰富多彩,可能萎靡不振,但这一次走过来了就是这一次的.希望以史为鉴,各位客官也能有所收获. 定位 我们这一届的"烟酒生&q ...

  7. API - 微云

    API - 微云 1.接口说明 2.数据上传协议说明 1. 接口说明 文件上传申请,成功会返回实际上传的地址. 根据申请上传返回的地址,组织数据上传. 1.1 URL OAuth2.0协议: http ...

  8. 【Struts2学习笔记(11)】对action的输入校验和XML配置方式实现对action的全部方法进行输入校验

    在struts2中,我们能够实现对action的全部方法进行校验或者对action的指定方法进行校验. 对于输入校验struts2提供了两种实现方法: 1. 採用手工编写代码实现. 2. 基于XML配 ...

  9. android新浪分享实例

    新浪分享比较简单,新浪有提供完整的demo. android实现新浪的分享功能,分3种分享情况: 纯文本的,带图片的,图片为本地图片(传入的是图片在手机的地址),第2种带图片的是,网络图片,图片地址为 ...

  10. 设置SVN忽略文件和文件夹(文件夹)

    在多数项目中你总会有文件和文件夹不须要进行版本号控制.这可能包含一些由编译器生成的文件,*.obj,*.lst,也许是一个用于存放可运行程序的输出文件夹.仅仅要你提交改动,TortoiseSVN 就会 ...