我看到了有趣的行为。我正在运行此代码
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
。谢谢。
答案 0 :(得分:8)
解释有点微妙。
Thread.run()
方法的默认行为被描述为运行提供的Runnable
(如果存在),否则不执行任何操作。
微妙的是,当一个线程退出时,exit()
方法“积极地”使引用字段为空,以防止存储泄漏。 (这里是the source ...第720行。)看来,当您在t1.run()
中调用main
时,线程已退出,因此调用是无操作。< / p>
当然,输出取决于main
线程是否在子线程退出之前再次运行...这将取决于您的平台;例如JVM和OS级别的线程调度程序的功能以及可用的内核数量。
答案 1 :(得分:0)
我刚刚在我的机器上运行了你的代码,我在输出中看到了“Running:main”。