线程的最佳实践一:不覆写Thread.start()方法
来源:互联网 发布:制作宣传栏软件 编辑:程序博客网 时间:2024/05/17 07:14
1.在java中实现线程有两种方式,一种是实现Runnable接口;一种是集成Thread类。无论是那一种,我们都会覆写run()方法,在这个方法里可以完成我们需要线程做的事。而不是覆写start()方法,对于java线程而言,调用start()方法时,该方法会调用我们线程的run()方法,那么这是怎么做到的呢?
2.Thread类的源码如下:
public synchronized void start() {//判断线程的状态,线程必须是未启动的 if (threadStatus != 0 || this != me) throw new IllegalThreadStateException(); group.add(this);//分配栈内存,启动线程,运行run方法 start0();//在启动前设置了停止状态 if (stopBeforeStart) { stop0(throwableFromStop);} } private native void start0();
由源码可以看出,关键部分在本地方法start0,它实现了启动线程,分配栈内存,运行run方法,修改线程状态的职责。这些都是由jvm负责的,如果覆盖了start方法,则失去了jvm对线程的管理。线程的start方法本身就将线程交给jvm管理了,使得程序员只需要关注线程的逻辑,而不用手动管理线程,这个方法为程序员提供了很多便利,没有理由要覆写这个方法。如果一定要覆写,那么一定要像这样:
@overridepublic void start(){super.start();//....}
不过覆写后没有什么实际意义。
3.线程的最佳实践之一就是覆写run方法,而不应该覆写start方法。
4.补充:由start方法的源码可以看出,即使一个线程在启动的时候已经是stop状态了,线程依然会启动,然后再stop。start方法的逻辑是先start一个线程,再校验该线程状态是否是stop,如果是再stop该线程。
参考书籍《编写高质量代码》
- 线程的最佳实践一:不覆写Thread.start()方法
- Thread的start方法。
- java Thread线程run()和start()方法的区别
- Thread线程中start()和run()方法的区别
- 线程Thread类的start()和run()
- Thread(线程),run(),start()
- Thread的run方法和start方法
- Thread的run方法和start方法
- Thread的run方法和start方法
- Rails的最佳实践【一】
- Rails的最佳实践【一】
- java中Thread线程中的 start()和run()方法的区别
- Android Thread类中方法run()与start()调用时,实际的线程运行情况!
- Thread.run()方法与Thread.start()方法的区别
- Thread类的start()和run()方法
- Thread的run和start方法区别
- Thread run()和start()方法的区别
- Thread的start()和join()方法
- HANLDE的归纳
- android 用Luncher启动应用的方式
- oracle监听注册
- linux timestamp
- Python_使用python解释器执行monkey runner脚本
- 线程的最佳实践一:不覆写Thread.start()方法
- http://poj.org/problem?id=2299 树状数组 《复习》
- 解读Cardinality Estimation算法(第一部分:基本概念)
- FFMpeg的解码流程
- 自定义的三个Oracle日期函数 dayadd datediff datepart
- Cocos2d_code fragment(2)
- Servlet映射规则和Servlet URL映射匹配原则
- 复用器
- 索引性能好不好让二元高度来说话