关于Thread类的start方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Thread类的start方法相关的知识,希望对你有一定的参考价值。
参考技术A 分类: 电脑/网络 >> 程序设计 >> 其他编程语言问题描述:
《Java就业培训教程》P180源码
程序清单:ThreadDemo3.java
public class ThreadDemo3
public static void main(String args[])
new TestThread ().start();
TestThread tt= new TestThread();创建TestThread类的一个实例
Thread t= new Thread(tt);创建一个Thread类的实例
t.start();使线程进入Runnable状态################
while(true)
System.out.println("main thread is running");
class TestThread implements Runnable extends Thread
public void run()线程的代码段,当执行start()时,线程从此出开始执行
while(true)
System.out.println(Thread.currentThread().getName() +
" is running");
问题:问题在有#############标志的行里。张孝祥的就业培训教程中说t.start()会调用实现了runnable的TestThread类中的run ()方法开始一个线程,但是t本身就是Thread的一个对象,也自然拥有Thread的run()方法才对,那样的话,怎么能够保证这里的t.start()会调用runnable的run 而不是Thread的run 呢?
估计查jdk的说明文档也可以找到,不过好费劲啊还或许看不明白。这里直接一些请教高人,本人考试在即,希望能说的尽量明白让初学者能够看懂请各位高人指点迷津,不吝赐教!
解析:
看一下Thread类的源码,也许你就能搞清楚为身么文档里这样解释。
这是Thread类的run()方法的代码。一目了然如果target存在的话执行target的run()方法,否则什么也不做。这样我们可以推测(因为Thread 实际运行的方法start0 是native方法 我们看不到它的实现)也就是说Thread的run()方法总是先被调用的,然后调用taget(构造函数中的Runnable对象)的run()方法。
public void run()
if (target != null)
target.run();
如果对于target的来历还有疑问,可以看一下构造函数的实现:
public Thread(Runnable target)
init(null, target, "Thread-" + nextThreadNum(), 0);
还没完那。。。, init 的实现:
private void init(ThreadGroup g, Runnable target, String name,
long stackSize)
太多了,不贴了,总之target 就是那个Runnable了
说的不清楚么?总之Thread的start方法会调用自己的run方法,run方法会调用用于构造的Runnable对象的run方法。另一个编写自己的线程的方法就是extends Thread类并改写run方法。
以上是关于关于Thread类的start方法的主要内容,如果未能解决你的问题,请参考以下文章
GroovyGroovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )