Java线程:在start()之后调用Thread对象上的run()方法

rob*_*erd 1 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.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());
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

Running: first
Running: first
Running: second
Running: second
Run Code Online (Sandbox Code Playgroud)

我期待看到类似的东西:

Running: first
Running: first
Running: second
Running: second
Running: main
Running: main
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我没有看到Running: main我的输出中的某个地方.谢谢.

Ste*_*n C 8

解释有点微妙.

Thread.run()方法的默认行为被描述为运行提供的(Runnable如果存在),否则不执行任何操作.

细微之处在于当线程退出时,该exit()方法"积极地"使引用字段无效以防止存储泄漏.(这是源代码 ......从第720行开始.)看来,当您调用t1.run()main,线程已经退出,因此调用是无操作.

当然,输出取决于main线程是否在子线程退出之前再次运行...这将取决于您的平台; 例如,JVM和OS级别的线程调度程序执行的操作以及可用的内核数量.

  • +1但是可能值得补充的是*它*可能*显示`Running:main`取决于线程调度(可能还有代码重新排序?不知道它是否最终确定). (4认同)