关于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方法的主要内容,如果未能解决你的问题,请参考以下文章

java中thread的start和run的区别

Java多线程:Thread类

GroovyGroovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )

Java创建多线程方式之一:继承Thread类

随笔 ① 关于java线程 --- 创建线程的方法

线程数