我正在编写一个简单的程序来计算两个平方矩阵乘法。程序应该在我预先定义的线程数之间划分工作。
我这样做的方法是每个线程计算结果矩阵的不同行。
所以每个线程执行的 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()
,它实际上可能会在工作线程完成执行之前结束。