在 上一篇(戳下看前情) 中,徐大带我们详细论证了,所有实现线程的方式归根结底就是基于 Runnable 接口或继承 Thread 类。接下来,请徐大继续解释,为什么说这两种方式本质上是一种。

一、 Runnable 接口和继承 Thread 类是同一种方式?

接 上一篇,我们可以进行更深层次的探讨,为什么说基于 Runnable 接口或继承 Thread 类,这两种方式本质上是一种呢?

1. Runnable 接口

首先,启动线程需要调用 start() 方法,而 start() 方法最终还会调用 run() 方法,我们先来看看第一种方式中 run() 方法究竟是怎么实现的。

@Override

可以看出 run() 方法的代码非常短小精悍,第 1 行代码 if (target != null) ,判断 target 是否等于 null,如果不等于 null,就执行第 2 行代码 target.run(),而 target 实际上就是一个 Runnable,即使用 Runnable 接口实现线程时传给 Thread 类的对象。

2. 继承 Thread 类

实际上,继承 Thread 类之后,会把上述的 run() 方法重写,重写后 run() 方法里直接就是所需要执行的任务,但它最终还是需要调用 thread.start() 方法来启动线程,而 start() 方法最终也会调用这个已经被重写的 run() 方法来执行它的任务。

这时我们就彻底明白了,事实上创建线程只有一种方式,就是构造一个 Thread 类,这是创建线程的唯一方式。

图片来源于网络

我们上面已经了解了两种创建线程方式在本质上是一样的,它们的不同点仅仅在于实现线程运行内容的不同。

那么运行内容来自于哪里呢?

运行内容主要来自于两个地方,要么来自于 target,要么来自于重写的 run() 方法。

在此基础上我们进行拓展,可以这样描述:

本质上,实现线程只有一种方式,而要想实现线程执行的内容,却有两种方式:也就是可以通过「实现 Runnable 接口」的方式,或是「继承 Thread 类重写 run() 方法」的方式,把我们想要执行的代码传入,让线程去执行。

如果我们还想有更多实现线程的方式,比如线程池和 Timer 定时器,只需要在此基础上进行封装即可。

二、实现 Runnable 接口和继承 Thread 类,哪个好?

下面我们来对刚才说的两种实现线程内容的方式进行对比,为什么说实现 Runnable 接口比继承 Thread 类实现线程要好?好在哪里呢?

1. 代码架构

实际上,Runnable 里只有一个 run() 方法,它定义了需要执行的内容,在这种情况下,实现了 Runnable 与 Thread 类的解耦,Thread 类负责线程启动和属性设置等内容,权责分明。

2. 提高性能

使用继承 Thread 类方式,每次执行一次任务,都需要新建一个独立的线程,执行完任务后线程走到生命周期的尽头被销毁,如果还想执行这个任务,就必须再新建一个继承了 Thread 类的类。

如果此时执行的内容比较少,比如只是在 run() 方法里简单打印一行文字,那么它所带来的开销并不大。

相比于整个线程从开始创建到执行完毕被销毁,这一系列的操作比 run() 方法打印文字本身带来的开销要大得多,相当于捡了芝麻丢了西瓜,得不偿失。

如果我们使用实现 Runnable 接口的方式,就可以把任务直接传入线程池,使用一些固定的线程来完成任务,不需要每次新建销毁线程,大大降低了性能开销。

3. 有利于代码未来拓展性

Java 语言不支持双继承,如果我们的类一旦继承了 Thread 类,那么它后续就没有办法再继承其他的类。

这样一来,如果未来这个类需要继承其他类实现一些功能上的拓展,它就没有办法做到了,相当于限制了代码未来的可拓展性。

综上所述,我们应该优先选择通过实现 Runnable 接口的方式来创建线程。


关注公众号 勾勾的Java宇宙,收获更多技术干货

java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...相关推荐

  1. java定时器只执行一次_面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)...

    爱因斯坦说过"耐心和恒心总会得到报酬的",我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在我身上实现了. 每一个程序员都拥有一座大厂梦,我也不例外,去年面试阿里P6,竟然被 ...

  2. java定时器每天执行一次_定时器-每天23:00执行一次

    2019/7/8 修改:为了获取接口每天的信息,比如获取今天 2019/7/8 00:00:00 的信息,从这个时间点是比较好的,如果直接在24点获取,在24点的时候,其实已经是第二天了,所以作修改为 ...

  3. 谈谈java面向对象之抽象,手把手带你搞定java面试之面向对象

    计算机语言晦涩难懂,打算利用通俗易懂的文字带领大家学习java基础.如果文中有什么错误的地方,欢迎大家在评论区指正,免得我误人子弟. Question:当面试JAVA开发岗位的时候,面试官最爱问的问题 ...

  4. java mybatis狂神说sql_帮你搞定Java面试,不要再错过了

    前言: 最近几年公司的大小招聘,社招.校招都有参与,遇到过许多厉害的,也遇到过很多职场小白.看着有些同学基础浮夸.做着重复的项目也没有任何总结沉淀,自我介绍完全不知道在说啥等等诸如此类的现状,如果你还 ...

  5. java 1秒执行一次_怎么让JAVA循环一秒一秒的执行

    package靖哥哥;importjava.util.Random;publicclassPlayextendsGame{Play(Strings){super(s);//TODOAuto-gener ...

  6. java 集合快速排序_搞定Java快速排序

    全文字数: 921 阅读时间: 3 分钟 1.简介? 快速排序(Quicksort),简称快排,是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1960年提出.它的基本思想分治法:即 ...

  7. java实现发送邮箱验证码——三步搞定java邮箱发送验证码

    大家好,我是你们不熟悉的超厂长,每天2--3更,发布java小白教程 微信公众号:程序员PG 今天早上一直在考虑网上的邮箱注册是怎么注册的 一般流程就是你输入你的邮箱和设置你的密码,点击发送后,就会发 ...

  8. scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了

    scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了 原因 If any execution of the task encounters an ...

  9. 并联串联混合的电压和电流_串联、并联电路的电压、电流和电阻是关键,“只需8句”口诀搞定...

    串联.并联电路的电压.电流和电阻是关键,"只需8句"口诀搞定 电路的串联.并联是初中物理的常考点,也是必考点.更是我们学习物理电路的基础,不同电路的电流和电压的计算却别很大,或许简 ...

最新文章

  1. AD9288的介绍和使用
  2. 2019年的wps计算机考试题,2019年3月计算机一级WPS模拟题及答案(2.21)
  3. Nacos分布式配置实践
  4. 带孩子们做环球旅行的读后感_阜南七小教师风采之乔娜:做孩子们成长的记录者...
  5. Linux常用脚本命令总结
  6. 火狐浏览器插件(XPI 文件)签名指南
  7. 今日头条打造“悟空浏览器”;AirPods 3将在中国生产;谷歌再次被罚400万卢布|极客头条...
  8. 利用计算机传播非法信息,非法侵入计算机信息系统罪如何处罚
  9. Shell 相互调用
  10. scala学习(一)
  11. 把触发器说透(转载)
  12. Dom4j报错之java.lang.NoClassDefFoundError: org/jaxen/JaxenException的解决方案
  13. 爬取百度图片——详细思路
  14. Excel数据计数(count)
  15. 带你Java入门(Java系列1)
  16. matlab实现5自由度雄克机器人的运动仿真
  17. cv2.putText()函数中各个参数含义
  18. linux与 win上装pyhive
  19. java多音字首字母排序
  20. 从0开始学股票第四课之量能的基本知识之成交量

热门文章

  1. openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
  2. Android学习笔记---26_网络通信之资讯客户端,使用pull解析器,解析,从网络中获得的自定义xml文件
  3. Android学习笔记---Android平台1.使用dom解析xml文件
  4. vs2008 代码对齐方式
  5. mybatis 配置文件中,collection 和 association 的对应关系
  6. 2014年5月30日
  7. 随想录(ccpp之间的相互调用)
  8. tts android,Android系统自带的TTS实现语音播报
  9. go kegg_玩转GO和KEGG富集因子图的N种姿势: 3种数据处理(含在线筛选条目),3种排序方式,本地交互图片...
  10. Solidworks如何在零件表面贴图