java - 线程卡在 Thread.join() 中,即使其他线程已终止

标签 java multithreading join jvm

我们的Java应用程序启动一个工作线程(使用Thread.start())。此后不久,它在工作线程上调用Thread.join()。工作线程执行一些操作并终止。第一个线程退出对 join() 的调用并继续其快乐的方式。标准内容:

Thread t = new WorkerThread();
t.start();

// Blah blah

t.join();

class WorkerThread extends Thread {
    public void run() {
        // Do some stuff
    }
}

至少这就是它应该如何工作,以及在我们可以重现的任何情况下它如何工作。然而,我们有一位客户一直遇到麻烦。

使用 PsiProbe 查看线程,他们发现工作线程已创建。它运行一段时间,但一段时间后就会从线程列表中消失。这种情况发生在意外的时间(基于与工作线程相关的其他事件的计时)。主线程永远不会退出 join() 调用。

这似乎破坏了 join() 的契约,并且对我来说意味着某种 JVM 级别的错误。有没有人目睹过这样的行为,或者知道是什么原因导致的?

编辑 3-3-11:

我仍在等待来自客户的结论性数据,但我似乎并不真正知道我认为我知道的事情:主线程可能不会在 join() 中阻塞根本没有,但在它之前的某个时刻。

无论如何,感谢大家的想法。

最佳答案

快速搜索Java Bugs Database没有吐出任何符合您症状的东西。但进行更广泛的搜索是值得的。

<小时/>

但是,值得注意的是,JVM bug 只是众多可能的理论之一(请参阅评论),现阶段几乎没有证据支持任何理论。如果我是你,我会:

  1. 弄清楚客户的平台是什么
  2. 在 Java 错误数据库中搜索任何似乎与观察到的症状(事实上确实如此)相匹配的已知错误。
  3. 如果您发现一个看似“命中”的错误,请进一步评估它,尝试确认这确实是客户的问题,并查看是否有任何方法可以缓解它。
  4. 此外...
    • 看看其他可能的理论;例如见上文
    • 尝试找出客户的安装与其他没有此问题的人相比有何不同
    • 添加更多监控,并尝试让客户使用该版本。

(在最后一个要点上,可能有必要向客户指出显而易见的事情。如果他们希望修复错误,他们可能需要做额外的事情来帮助您追踪错误,例如安装运行“应用程序的实验版”。)

关于java - 线程卡在 Thread.join() 中,即使其他线程已终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5149999/

相关文章:

Mysql通过加入另一个表来更新表

java - SWING 禁用或隐藏滚动条,但启用滚轮?

java - 作用域 bean : inject one into another

Java发送消息线程

mysql - 我是否错误地进行了嵌套连接?

postgresql - 如何获得一个简单的散列连接查询来执行以及一个复杂的排序合并查询?

java - 生成 zip 中包含 POI 的 xlsx 文件

java - 使用循环从 JTextFields 获取值

java - 线程ID=1 : thread exiting with uncaught exception (group=0x41cd1700)

java - 多个线程如何执行我的方法?