Java 线程卡在Thread.join()中,即使其他线程已终止
我们的Java应用程序启动一个工作线程(使用Java 线程卡在Thread.join()中,即使其他线程已终止,java,multithreading,join,jvm,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() { /
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()
中阻塞,而是在它之前的某个点阻塞
无论如何,感谢所有人的想法。快速搜索并没有发现任何符合您症状的东西。但它值得你去做更广泛的搜索
然而,值得注意的是,JVM bug只是许多可能的理论之一(参见注释),在这个阶段,几乎没有证据支持任何理论。如果我是你,我会:
- 看看其他可能的理论;e、 g.见上文
- 尝试找出客户的安装与其他没有此问题的客户的安装有什么不同
- 添加更多监控,并尝试让客户使用该版本
(在最后一点上,可能有必要向客户指出显而易见的问题。如果他们希望修复错误,他们可能需要做额外的工作来帮助您跟踪错误,比如安装并运行一个“实验”版本的应用程序。)好的,您已经安装了thread.join()而不是t.join()或者你刚才输入错误了吗?我会在工作线程中添加日志记录,并在start/join调用之前/之间/之后耦合日志记录语句。另一种解决方案是使用超时(join(long millis))调用join。即使存在JVM级别的错误,这也可以解决问题。您的客户在什么版本的Java(补丁级别)和什么平台上看到这个问题?@dontocsta是的,只是输入错误;将修复,谢谢。@Stephen C-现在很明显这可能是JVM的问题,我需要了解版本的细节。它在JBossAS 4.2.3(我想)下运行,如果这有关系的话。