加入()多个线程并处理泄漏的输出

时间:2015-10-11 02:12:15

标签: java multithreading wait interrupt dining-philosopher

我正在解决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 个答案:

答案 0 :(得分:0)

您在底部编辑的代码,它会在迭代for()两次之前成为永久循环。