我正在用 Java 解决一个多线程问题,并解决了核心问题本身,但我的输出不是我所期望的。
我有一个主线程,它旋转新线程,每个线程都执行它们的任务。它看起来像以下(伪代码):
initializeThreads(); // Creates the new threads
startThreads(); // Starts the new threads
sleep( duration ); // Lets the threads run for `duration` time
shutdownThreads(); // interrupt the threads
printOutput(); // output the results to the console
// definition of shutdownThreads() is at the end of my question
我的问题发生在尝试join()
在我的线程列表中的每个线程上。我的程序时不时陷入无限循环,因为我猜interrupt()
我在线程列表上的调用与 相比发生得不够快,join()
而且并非所有线程都被中断。
当程序确实正确关闭线程并打印终止输出时,会出现我的另一个问题。当程序运行时,每个线程都有它记录到控制台的消息,并且在我中断线程并显示最终的程序消息之后,这些线程特定的日志消息中的一些会泄漏到控制台。
例如,假设我的一个线程"Thread-1 waiting for lock on object..."
在运行时输出,主程序最终将自己唤醒,终止线程并输出"Program finished"
。有时,线程特定的消息会在程序终止消息之后出现。
如果有人可以帮助我弄清楚如何阻止这种情况发生,请告诉我!
关机线程()
private void shutdownThreads() {
Thread t;
for (int i = 0; i < threads.size(); i++) {
t = threads.get(i);
t.interrupt();
}
for (int i = 0; i < threads.size(); i++) {
t = threads.get(i);
try {
t.join();
} catch (InterruptedException e) {
System.out.println("Interrupted while waiting on thread to exit");
}
}
}
编辑:我想做的一件事是重写shutdownThreads()
来做到这一点:
for (int i = 0; i < threads.size(); i++) {
Thread t = threads.get(i);
t.interrupt();
while (!t.isInterrupted()) ;
}
但这似乎不太优雅。