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

Posted

技术标签:

【中文标题】加入多个线程并处理泄漏的输出【英文标题】:Join()ing on multiple threads and handling leaked output 【发布时间】:2016-01-08 17:42:01 【问题描述】:

我正在用 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()) ;

但这似乎不太优雅。

【问题讨论】:

您应该考虑使用ExecutorService。您只需将 Callables 提交给 ExecutorService 的 invokeAll 方法,而不是创建线程。 【参考方案1】:

您在底部编辑的代码,在迭代 for() 两次之前,这将是一个永远循环。

【讨论】:

什么意思?无论threads 多大,它都会运行。它在i 处获取线程,中断它,然后忙等待直到线程被中断。 为什么不睡觉?它在资源方面具有成本效益。

以上是关于加入多个线程并处理泄漏的输出的主要内容,如果未能解决你的问题,请参考以下文章

Java应用线程泄漏原因分析与避免

同步处理来自多个线程的数据

主函数跳过线程而不加入以显示所需的输出

内存泄漏处理Xamarin.Forms

如何将创建多个字典的 for 循环的输出加入/合并到一个大字典中

php的异常处理,一个try代码块中抛出了多个异常,怎么全都捕获,并输出来?下面的代码为只输出一个异常?