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