彻底理解Runnable与Thread,真的有区别吗?
网络上流传的最大的一个错误结论:
Runnable更容易可以实现多个线程间的资源共享,而Thread不可以! 这是一个二笔的结论!
Thread与Runnable的实质
Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系,不是同类东西,所以Runnable或Thread本身没有可比性。
那我们来看一下为什么会出现上面的二笔结论
- 首先使用Thread来模仿线程同步
//program--Thread
public class Test {public static void main(String[] args) {// TODO Auto-generated method stubnew MyThread().start();new MyThread().start();}static class MyThread extends Thread{private int ticket = 5;public void run(){while(true){System.out.println("Thread ticket = " + ticket--);if(ticket < 0){break;}}}}
}
运行结果:
Thread ticket = 5
Thread ticket = 5
Thread ticket = 4
Thread ticket = 3
Thread ticket = 2
Thread ticket = 1
Thread ticket = 0
Thread ticket = 4
Thread ticket = 3
Thread ticket = 2
Thread ticket = 1
Thread ticket = 0Process finished with exit code 0
- 其次是Runnable实现的线程同步
//program--Runnable
public class Test2 {public static void main(String[] args) {// TODO Auto-generated method stubMyThread2 mt=new MyThread2();new Thread(mt).start();new Thread(mt).start();}static class MyThread2 implements Runnable{private int ticket = 5;public void run(){while(true){System.out.println("Runnable ticket = " + ticket--);if(ticket < 0){break;}}}}
}
运行结果:
Runnable ticket = 5
Runnable ticket = 4
Runnable ticket = 3
Runnable ticket = 1
Runnable ticket = 0
Runnable ticket = 2Process finished with exit code 0
- 从两次运行结果中,我们可以看到Runnable会更接近正确的答案(先不考虑线程同步问题)。所以得出了Runnable更容易可以实现多个线程间的资源共享,而Thread不可以的结论。
真的是这样的吗?我们来看一下线程的内存分析。
- 这是根据Thread实现的并发线程。
- 这是根据Runnable实现的并发线程
- 显然Thread运行结果重复是因为new了两个MyThread,导致ticket变量有两个。Runnable中两个线程都指向一个ticket变量,所以没有重复。
推翻二笔结论
public class Test3 extends Thread {private int ticket = 10;public void run(){for(int i =0;i<10;i++){synchronized (this){if(this.ticket>0){try {Thread.sleep(100);System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));} catch (InterruptedException e) {e.printStackTrace();}}}}}public static void main(String[] arg){Test3 t1 = new Test3();new Thread(t1,"线程1").start();new Thread(t1,"线程2").start();}}
运行结果:
线程1卖票---->10
线程1卖票---->9
线程1卖票---->8
线程1卖票---->7
线程1卖票---->6
线程1卖票---->5
线程1卖票---->4
线程1卖票---->3
线程1卖票---->2
线程1卖票---->1Process finished with exit code 0
彻底理解Runnable与Thread,真的有区别吗?相关推荐
- 彻底理解Runnable和Thread的区别
鄙人的新书<Elasticsearch权威指南>正式出版发行,欢迎购买!本书由华为.中兴高级技术专家全面审读并撰序,助您挑战百万年薪 购书链接: <Elasticsearch权威指南 ...
- Android Handler Runnable和Thread之间的区别和联系详解
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!...
http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnab ...
- Android开发笔记之:Handler Runnable与Thread的区别详解
From:http://www.jb51.net/article/37465.htm 本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友 ...
- Java中Runnable和Thread的区别
2019独角兽企业重金招聘Python工程师标准>>> 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.la ...
- Java线程之两种方法Runnable和Thread的区别
在java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口: 1>Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的 ...
- java中runnable_Java中Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- Runnable和Thread的区别
1.Runnable的实现方式是实现其接口即可 2.Thread的实现方式是继承其类 3.Runnable接口支持多继承,但基本上用不到 4.Thread实现了Runnable接口并进行了扩展,而Th ...
- 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等
1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...
最新文章
- [分享]写出健壮的Bash脚本
- 位运算与组合搜索(二)
- 综述论文要写英文摘要吗_速成本科毕业论文初稿!!!
- Valid BFS? CodeForces - 1037D(思维 bfs)
- 基于docker在Ubuntu上搭建TensorFlow-GPU计算环境
- 保证MQ消费消息的幂等性,真可以用版本号的方式?
- 核函数(Kernel Function)与SVM
- 循环删除list中多个元素
- CKplayer功能配置
- Office 右键新建没有office选项怎么办
- 使用python3抓取链家二手房数据
- 携程网跨站弱点及物理路径泄漏
- 如何增加微信朋友圈分享链接的小图片
- 世界最大射电望远镜(Arecibo)用于探测地外文明
- 《剑指offer》刷题——【链表】从尾到头打印链表
- iOS应用的启动流程和优化详解
- 低码框架 json-script-rule 高级查询说明
- 机器学习之降维(特征选择与特征提取)
- 湖南省邵阳市谷歌高清卫星地图下载
- 基于zynq的千兆网udp项目_基于Zynq平台的EtherCAT主站方案实现