关于Thread类的start方法

来源:百度知道 编辑:UC知道 时间:2024/05/22 04:26:42
《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方法。

true是boolean类型的量,为恒真,所以while(true)是一个死循环,如果需要退出循环就要在while(true){}的大括号里加入break语句了。这里是为了循环的出现字符串“Java now~”。

this 是指这个类本身,也就是jex类,因为类Thread为构造方法里有Thread(Runnable r),而jex类本身实现了Runnab