在我的java应用程序中,我有很多线程,但有几个最重要的线程,它们执行复杂的计算(访问远程数据库等)。
如果所有这些重要的线程都是died
,那么我需要退出应用程序,即使不太重要的线程仍在运行。
我实现了一个额外的(线程)类来监视这些具有核心功能的线程:
boolean allThreadsDied;
do {
allThreadsDied = true;
for (Thread oneThread : threadsList) {
allThreadsDied = allThreadsDied & (!oneThread.isAlive());
}
} while (!allThreadsDied);
// now, it's time to quit the application
此线程永久运行并检查重要线程的状态。
我想我发明了一辆自行车,而且非常不高效的自行车。因为这个永久运行的线程会产生很高的处理器负载,即使没有当前的计算。
我的问题如下:是否有更有效的方法来监控一组线程并在所有这些线程都死亡时获得信号?
答案 0 :(得分:4)
将所有非重要线程标记为daemon
个线程(请参阅:Thread.setDaemon()
)并正常启动所有重要线程。
一旦所有非守护程序线程都死了/完成,JVM就会自动退出。
答案 1 :(得分:2)
像这样使用Thread.join
:
for (Thread t : threadsList) {
t.join();
}
假设您将此代码放在main
方法的末尾。调用t.join()
将导致主线程等待,直到线程t
死亡。
答案 2 :(得分:1)
将整个事情改为:
for (Thread oneThread : threadsList) {
try {
oneThread.join();
} catch (InterruptedException ie) {
// handle this
}
}
这将等待每个线程完成其处理,但不会浪费CPU周期。 (运行它的线程将在join
期间休眠。)
答案 3 :(得分:0)
创建线程时,您可以指定它是否是“守护程序”线程。当main()
返回时,如果有任何非守护程序线程在运行,应用程序将继续运行,但如果只保留守护程序线程,它将不会继续运行。当你产生非重要线程时,你可以将它们生成为可以实现你想要的守护线程。
答案 4 :(得分:0)
这可能是您的问题的答案:线程可以被标记为守护进程。守护程序线程不会阻止JVM关闭。因此,在您的情况下,使用thread.setDaemon(true)
方法保持工作线程“按原样”和不太重要的线程作为守护程序。
答案 5 :(得分:-1)
通常应用程序会自动退出。无论:
System.exit(0); // forces the app to exit.