Join() в нескольких потоках и обработка утечек
Я решаю многопоточную проблему в 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"
, Иногда сообщение о потоке будет отображаться после сообщения о завершении программы.
Если кто-нибудь может помочь мне понять, как это предотвратить, пожалуйста, дайте мне знать!
shutdownThreads ()
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()) ;
}
но это не кажется слишком элегантным.
1 ответ
Ваш отредактированный код внизу, это будет вечный цикл, прежде чем он будет повторять for() дважды.