网络上流传的最大的一个错误结论:

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,真的有区别吗?相关推荐

  1. 彻底理解Runnable和Thread的区别

    鄙人的新书<Elasticsearch权威指南>正式出版发行,欢迎购买!本书由华为.中兴高级技术专家全面审读并撰序,助您挑战百万年薪 购书链接: <Elasticsearch权威指南 ...

  2. Android Handler Runnable和Thread之间的区别和联系详解

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  3. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!...

    http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnab ...

  4. Android开发笔记之:Handler Runnable与Thread的区别详解

    From:http://www.jb51.net/article/37465.htm 本篇文章是对在Android中Handler Runnable与Thread的区别进行了详细的分析介绍,需要的朋友 ...

  5. Java中Runnable和Thread的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.la ...

  6. Java线程之两种方法Runnable和Thread的区别

    在java中有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口: 1>Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的 ...

  7. java中runnable_Java中Runnable和Thread的区别

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  8. Runnable和Thread的区别

    1.Runnable的实现方式是实现其接口即可 2.Thread的实现方式是继承其类 3.Runnable接口支持多继承,但基本上用不到 4.Thread实现了Runnable接口并进行了扩展,而Th ...

  9. 【Java之多线程(二)】(***重要***)Java多线程中常见方法的区别,如object.wait()和Thread.sleep()的区别等

    1.Java中Thread和Runnable的区别??? 区别: 在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处: 避免点 ...

最新文章

  1. [分享]写出健壮的Bash脚本
  2. 位运算与组合搜索(二)
  3. 综述论文要写英文摘要吗_速成本科毕业论文初稿!!!
  4. Valid BFS? CodeForces - 1037D(思维 bfs)
  5. 基于docker在Ubuntu上搭建TensorFlow-GPU计算环境
  6. 保证MQ消费消息的幂等性,真可以用版本号的方式?
  7. 核函数(Kernel Function)与SVM
  8. 循环删除list中多个元素
  9. CKplayer功能配置
  10. Office 右键新建没有office选项怎么办
  11. 使用python3抓取链家二手房数据
  12. 携程网跨站弱点及物理路径泄漏
  13. 如何增加微信朋友圈分享链接的小图片
  14. 世界最大射电望远镜(Arecibo)用于探测地外文明
  15. 《剑指offer》刷题——【链表】从尾到头打印链表
  16. iOS应用的启动流程和优化详解
  17. 低码框架 json-script-rule 高级查询说明
  18. 机器学习之降维(特征选择与特征提取)
  19. 湖南省邵阳市谷歌高清卫星地图下载
  20. 基于zynq的千兆网udp项目_基于Zynq平台的EtherCAT主站方案实现

热门文章

  1. 《江苏省ITS体系框架与规划——需求分析子课题》工作大纲评审会在南京举行[转贴,出处:ITSC 作者:刘浩,张可]
  2. 【Python零基础到入门】Python基础语法篇——基本数据类型【文末送书】
  3. 拼多多不补单有什么后果?怎么避免补单风险?
  4. 次氯酸钠发生器选型依据,再也不怕选不对设备了
  5. crack-jar游戏之乐游
  6. Excel统一添加前缀与后缀
  7. 为什么Flutter是跨平台开发的终极之选
  8. java菜鸟快速上手指南
  9. 色粉笔画的简史和怎样画色粉笔画?
  10. python爬虫学习笔记 3.9 (了解参考:训练Tesseract)