gpt4 book ai didi

java - 连接多个线程并处理泄漏的输出

转载 作者:太空宇宙 更新时间:2023-11-04 13:20:58 25 4
gpt4 key购买 nike

我正在解决 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() 时。我的程序时不时地陷入无限循环,因为我猜测与 join() 相比,我在线程列表上调用的 interrupt() 发生得不够快,而且并非所有线程都被中断。

当程序正确关闭线程并打印终止输出时,会出现另一个问题。当程序运行时,每个线程都有记录到控制台的消息,在我中断线程并显示最终程序消息后,其中一些特定于线程的日志消息会泄漏到控制台。

例如,假设我的一个线程在运行时输出“Thread-1 waiting for lock on object...”,主程序最终唤醒自身,终止线程,并输出“程序完成”。有时,线程特定的消息会在程序终止消息之后出现。

如果有人可以帮助我找出如何阻止这种情况发生,请告诉我!

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()) ;
}

但这看起来不太优雅。

最佳答案

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

关于java - 连接多个线程并处理泄漏的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com