有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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吗。多谢各位


共 (2) 个答案

  1. # 1 楼答案

    这个解释有点微妙

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

    微妙之处在于,当线程退出时,exit()方法“积极地”清空引用字段以防止存储泄漏。(这里是the source……第720行之后。)似乎在main中调用t1.run()时,线程已经退出,因此调用是不可操作的

    当然,输出取决于main线程是否在子线程退出之前再次运行。。。这将取决于你的平台;e、 g.JVM和OS级线程调度程序的功能以及可用的内核数量

  2. # 2 楼答案

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