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() дважды.

Другие вопросы по тегам