main() 可以在加入所有线程之前结束运行吗?



我正在编写一个简单的程序来计算两个平方矩阵乘法。程序应该在我预先定义的线程数之间划分工作。

我这样做的方法是每个线程计算结果矩阵的不同行。

所以每个线程执行的 run() 方法是:

@Override
public void run() {
    for (int y = 0; y < numLines; y++)
        for (int x = 0; x < matrixSize; x++)
            result[startLine + y][x] = singleIndexCalc(startLine + y, x);
}

该程序没有同步(任何地方)。所以我的问题是我是否必须在结束main()方法之前注意加入线程,或者没关系,因为线程(肯定)会完成运行并死亡。

我问这个是因为我不想离开正在运行的线程(例如,当它们被卡住等待时可能会发生这种情况),但在这个例子中,这是不可能的。

谢谢!

是的,主线程可以在其他线程结束之前结束运行。

看看Thread类的setDaemon()方法:https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setDaemon(布尔值)

将此线程标记为守护程序线程或用户线程。当唯一运行的线程都是守护程序线程时,Java 虚拟机将退出。

必须在启动线程之前调用此方法。

JVM 将在所有非守护程序线程执行完毕后关闭。

在您的情况下,一旦主线程和工作线程完成执行,JVM 将关闭,程序将结束。

一个有趣的说明:如果主线程没有在任何工作线程上调用join(),它实际上可能会在工作线程完成执行之前结束。

最新更新