Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程卡在Thread.join()中,即使其他线程已终止_Java_Multithreading_Join_Jvm - Fatal编程技术网

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

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() { /

我们的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()
中阻塞,而是在它之前的某个点阻塞

无论如何,感谢所有人的想法。

快速搜索并没有发现任何符合您症状的东西。但它值得你去做更广泛的搜索


然而,值得注意的是,JVM bug只是许多可能的理论之一(参见注释),在这个阶段,几乎没有证据支持任何理论。如果我是你,我会:

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

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

    好的,您已经安装了thread.join()而不是t.join()或者你刚才输入错误了吗?我会在工作线程中添加日志记录,并在start/join调用之前/之间/之后耦合日志记录语句。另一种解决方案是使用超时(join(long millis))调用join。即使存在JVM级别的错误,这也可以解决问题。您的客户在什么版本的Java(补丁级别)和什么平台上看到这个问题?@dontocsta是的,只是输入错误;将修复,谢谢。@Stephen C-现在很明显这可能是JVM的问题,我需要了解版本的细节。它在JBossAS 4.2.3(我想)下运行,如果这有关系的话。