1

我看到了有趣的行为。我正在运行这段代码

public class ThreadsTest {

    public static void main(String[] args) {
        Runnable mr = new MyRunnable();
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        t1.setName("first");
        t2.setName("second");
        t1.start();
        t2.start();
        t1.run();
    } 
} 

class MyRunnable implements Runnable {
    public void run() {
    for (int i=0; i < 2; i++) {
        System.out.println("Running: " + Thread.currentThread().getName());
    }
    }
}

我得到的输出是:

Running: first
Running: first
Running: second
Running: second

我期待看到类似的东西:

Running: first
Running: first
Running: second
Running: second
Running: main
Running: main

有谁知道为什么我Running: main在输出中看不到某处。谢谢你。

4

2 回答 2

8

解释有点微妙。

Thread.run()方法的默认行为被描述为运行提供的Runnable如果它存在,否则什么也不做。

微妙之处在于,当 Thread 退出时,该exit()方法“积极地”清空引用字段以防止存储泄漏。(这里是源代码......第 720 行以后。)看来,当您调用t1.run()main,线程已经退出,因此调用是无操作的。

自然,输出取决于线程是否main在子线程退出之前再次运行......这取决于您的平台;例如,JVM 和操作系统级别的线程调度程序做什么以及有多少内核可用。

于 2013-02-10T04:23:12.210 回答
0

我刚刚在我的机器上运行了你的代码,我在输出中看到了“正在运行:main”。

于 2013-02-10T04:23:38.253 回答