java定时器只执行一次_搞定Java并发:为什么说只有1种实现线程的方法?(下)...
在 上一篇(戳下看前情) 中,徐大带我们详细论证了,所有实现线程的方式归根结底就是基于 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种实现线程的方法?(下)...相关推荐
- java定时器只执行一次_面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)...
爱因斯坦说过"耐心和恒心总会得到报酬的",我也一直把这句话当做自己的座右铭,这句箴言在今年也彻底在我身上实现了. 每一个程序员都拥有一座大厂梦,我也不例外,去年面试阿里P6,竟然被 ...
- java定时器每天执行一次_定时器-每天23:00执行一次
2019/7/8 修改:为了获取接口每天的信息,比如获取今天 2019/7/8 00:00:00 的信息,从这个时间点是比较好的,如果直接在24点获取,在24点的时候,其实已经是第二天了,所以作修改为 ...
- 谈谈java面向对象之抽象,手把手带你搞定java面试之面向对象
计算机语言晦涩难懂,打算利用通俗易懂的文字带领大家学习java基础.如果文中有什么错误的地方,欢迎大家在评论区指正,免得我误人子弟. Question:当面试JAVA开发岗位的时候,面试官最爱问的问题 ...
- java mybatis狂神说sql_帮你搞定Java面试,不要再错过了
前言: 最近几年公司的大小招聘,社招.校招都有参与,遇到过许多厉害的,也遇到过很多职场小白.看着有些同学基础浮夸.做着重复的项目也没有任何总结沉淀,自我介绍完全不知道在说啥等等诸如此类的现状,如果你还 ...
- java 1秒执行一次_怎么让JAVA循环一秒一秒的执行
package靖哥哥;importjava.util.Random;publicclassPlayextendsGame{Play(Strings){super(s);//TODOAuto-gener ...
- java 集合快速排序_搞定Java快速排序
全文字数: 921 阅读时间: 3 分钟 1.简介? 快速排序(Quicksort),简称快排,是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1960年提出.它的基本思想分治法:即 ...
- java实现发送邮箱验证码——三步搞定java邮箱发送验证码
大家好,我是你们不熟悉的超厂长,每天2--3更,发布java小白教程 微信公众号:程序员PG 今天早上一直在考虑网上的邮箱注册是怎么注册的 一般流程就是你输入你的邮箱和设置你的密码,点击发送后,就会发 ...
- scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了
scheduled线程池ScheduledExecutorService只执行一次_有个定时任务突然不执行了 原因 If any execution of the task encounters an ...
- 并联串联混合的电压和电流_串联、并联电路的电压、电流和电阻是关键,“只需8句”口诀搞定...
串联.并联电路的电压.电流和电阻是关键,"只需8句"口诀搞定 电路的串联.并联是初中物理的常考点,也是必考点.更是我们学习物理电路的基础,不同电路的电流和电压的计算却别很大,或许简 ...
最新文章
- AD9288的介绍和使用
- 2019年的wps计算机考试题,2019年3月计算机一级WPS模拟题及答案(2.21)
- Nacos分布式配置实践
- 带孩子们做环球旅行的读后感_阜南七小教师风采之乔娜:做孩子们成长的记录者...
- Linux常用脚本命令总结
- 火狐浏览器插件(XPI 文件)签名指南
- 今日头条打造“悟空浏览器”;AirPods 3将在中国生产;谷歌再次被罚400万卢布|极客头条...
- 利用计算机传播非法信息,非法侵入计算机信息系统罪如何处罚
- Shell 相互调用
- scala学习(一)
- 把触发器说透(转载)
- Dom4j报错之java.lang.NoClassDefFoundError: org/jaxen/JaxenException的解决方案
- 爬取百度图片——详细思路
- Excel数据计数(count)
- 带你Java入门(Java系列1)
- matlab实现5自由度雄克机器人的运动仿真
- cv2.putText()函数中各个参数含义
- linux与 win上装pyhive
- java多音字首字母排序
- 从0开始学股票第四课之量能的基本知识之成交量
热门文章
- openoffice使用总结001---版本匹配问题unknown document format for file: E:\apache-tomcat-8.5.23\webapps\ZcnsDms\
- Android学习笔记---26_网络通信之资讯客户端,使用pull解析器,解析,从网络中获得的自定义xml文件
- Android学习笔记---Android平台1.使用dom解析xml文件
- vs2008 代码对齐方式
- mybatis 配置文件中,collection 和 association 的对应关系
- 2014年5月30日
- 随想录(ccpp之间的相互调用)
- tts android,Android系统自带的TTS实现语音播报
- go kegg_玩转GO和KEGG富集因子图的N种姿势: 3种数据处理(含在线筛选条目),3种排序方式,本地交互图片...
- Solidworks如何在零件表面贴图