Java线程:在start()之后对线程对象调用run()方法
我看到了有趣的行为。我正在运行这个代码Java线程:在start()之后对线程对象调用run()方法,java,Java,我看到了有趣的行为。我正在运行这个代码 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.setNa
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: main
Running: main
有人知道为什么我在输出中的某个地方没有看到
Running:main
。谢谢。解释有点微妙
Thread.run()
方法的默认行为描述为运行提供的Runnable
(如果存在),否则不执行任何操作
微妙之处在于,当线程退出时,exit()
方法“积极地”清空引用字段以防止存储泄漏。(这里是第720行之后的内容。)似乎在您在main
中调用t1.run()
时,线程已经退出,因此该调用是不可操作的
当然,输出取决于
main
线程是否在子线程退出之前再次运行。。。这将取决于你的平台;e、 g.JVM和操作系统级线程调度程序的功能以及可用的内核数量。解释有点微妙
Thread.run()
方法的默认行为描述为运行提供的Runnable
(如果存在),否则不执行任何操作
微妙之处在于,当线程退出时,exit()
方法“积极地”清空引用字段以防止存储泄漏。(这里是第720行之后的内容。)似乎在您在main
中调用t1.run()
时,线程已经退出,因此该调用是不可操作的
当然,输出取决于
main
线程是否在子线程退出之前再次运行。。。这将取决于你的平台;e、 g.JVM和操作系统级线程调度程序的功能以及可用的内核数量。我刚刚在我的机器上运行了你的代码,在输出中看到了“Running:main”。我刚刚在我的机器上运行了你的代码,在输出中看到了“Running:main”。我不确定你为什么希望这样做。您能解释一下吗?在Thread对象t1.run()
上调用run()方法应该调用MyRunnable类中的run方法。并且它应该输出当前运行的线程是主线程。对线程对象调用run()方法的行为应与对任何其他对象调用任何方法的行为相同。我希望我的回答对你有意义。我不知道你为什么希望这样。您能解释一下吗?在Thread对象t1.run()
上调用run()方法应该调用MyRunnable类中的run方法。并且它应该输出当前运行的线程是主线程。对线程对象调用run()方法的行为应与对任何其他对象调用任何方法的行为相同。我希望我的回答对你有意义。同样的:跑步:主要跑步:第二次跑步:第一次跑步:第二次跑步:主要跑步:第一次是的。。。输出将取决于平台。参见我的答案。相同:跑步:主要跑步:第二次跑步:第一次跑步:第二次跑步:主要跑步:第一次是。。。输出将取决于平台。请参阅我的答案。+1但可能值得补充的是,它可能会显示Running:main
,具体取决于线程调度(可能还有代码重新排序?对它的了解还不足以确定)。Stephen C的解释是有意义的。非常感谢。Brian Roach这是真的,您无法预测调度将如何工作。我只是不明白为什么run从未执行过。谢谢大家。+1但可能值得补充的是,它可能会显示Running:main
,这取决于线程调度(可能还有代码重新排序?我对它的了解还不够明确)。Stephen C的解释是有意义的。非常感谢。Brian Roach这是真的,您无法预测调度将如何工作。我只是不明白为什么run从未执行过。谢谢各位。
Running: first
Running: first
Running: second
Running: second
Running: main
Running: main