gpt4 book ai didi

Java 多线程 : Thread will not finish run() method

转载 作者:行者123 更新时间:2023-11-30 08:04:05 25 4
gpt4 key购买 nike

我正在尝试了解 Java 多线程,但在让该线程完成其运行方法时遇到了一些麻烦。

我有两个工作线程使用阻塞队列中的消息。他们应该对传递的值做一些简单的事情并将结果附加到文件中。因为我不想为每个 I/O 操作打开一个文件读取器,所以我想使用一个 StringBuilder 来逐渐构建报告,并在线程被踢出它的主循环时将其全部写入。然而,循环之后的代码似乎从未运行过。

这是在线程中运行的代码:

@Override
public void run() {

StringBuilder builder = new StringBuilder();

while(true) {

if(!shouldRun) break;

try {
WorkMessage msg = (WorkMessage) ((BlockingQueue) inputQueue).take();

int payload = msg.payload;
LocalTime time = msg.timeCreated;

String report = "Adder got message at: " + time + ". Result: " + (payload + toAdd);

builder.append(report);

} catch (InterruptedException ie) {
System.out.println("ERROR IN ADDER: " + ie.getMessage());
}
}
writeToReportFile(builder.toString());
}

writeToReportFile 方法未被调用。当我在控制线程中将 shouldRun 设置为 false 时,它​​似乎跳过了 while 循环结束后的代码。我没有直接从外部线程将 shouldRun 设置为 false,而是从外部调用内部 kill() 方法,该方法将 shouldRun 设置为内部错误。

有人知道为什么会这样吗?我确定我只是在这里遗漏了一些简单的东西。

最佳答案

线程很可能因为 take() 而被阻塞。而不是 taking() 为什么不使用 poll(time,timeunit) 方法测试此代码,该方法将等待指定时间然后返回,因此在等待指定时间后它将检查您的标志 shouldRun 并退出循环.

来源: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html#poll(long,%20java.util.concurrent.TimeUnit)

另外请将变量 shouldRun 声明为 volatile。原因:以下摘录来自 Java concurrency in practice 一书:

“服务器 JVM 比客户端 JVM 执行更多的优化,例如将变量提升到循环之外,但在循环中未修改;”

因此在使用服务器 JVM 的环境中,您可能会陷入无限循环,因为循环内不会修改 shouldRun 变量。

关于Java 多线程 : Thread will not finish run() method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925007/

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