线程消失得无影无踪

时间:2011-04-20 19:36:42

标签: java multithreading concurrency yield

我正在尝试调试问题。我们有很少的线程可以处理来自BoundedLinkedQueue的数据。处理完一条记录后,当前线程执行Thread.currentThread().yield()

现在,有一段时间观察到其中一个线程消失了!我已经跟踪了日志,发现这样一个“消失”的线程一直工作到yield语句。之后没有找到该线程的痕迹 - 也没有在线程的最后一个日志附近抛出任何错误或异常。

任何人都可以提供调试方向的指示吗?产量的用法是否正确?产量是否可靠?这是因为我发现this文章建议避免收益率声明?有没有人见过这样的病情?

编辑:在某些研究中,似乎try / catch可能会遗漏一些异常,而这些异常只会放入System.err中,这在多线程环境中可能并不明显。感谢@JVerstry指针,我为Thread设置了uncaughtexceptionhandler。构建和运行过程需要很长时间。一旦我有了具体的东西,我会更新。 以下是一些谈论UncaughtExceptionHandler的链接:

4 个答案:

答案 0 :(得分:1)

正如您所链接的文章所指出的,yield并未定义当前量是否被中断。如果在线程退出之前正好屈服,那么调度程序可能会完成线程的量程,导致线程立即退出。

答案 1 :(得分:0)

收益率不会使线程消失。您的线程可能会抛出异常并且未捕获该异常。你实施了uncaught exception handler了吗?如果没有,那么我建议你这样做。它会解释你的问题(除非线程自然结束,你的代码没有做你认为应该做的事情)。

答案 2 :(得分:0)

  1. 收益后会发生什么?线程会退出还是会尝试处理队列中的另一段数据?
  2. 您应该验证在使用日志记录实际调用yield之后调用的内容。
  3. 你怎么知道线程已经退出?您是否通过查看堆栈跟踪(使用Jstack)进行验证?
  4. 最后你为什么要使用屈服?我假设你的BoundedLinkedQueue允许线程以线程安全的方式检索数据,或者如果队列为空则阻塞。为什么不让JVM管理线程调度呢?

答案 3 :(得分:0)

我们能够在重新发生时获得一个线程转储,并且看起来该线程只是在JDBC调用上永远阻塞 - 这是jdbc jar中的一个错误。我们刚刚用最新版本替换了jar,似乎已经解决了它。感谢所有宝贵的意见 - 让我学到了很多新东西。此外,现在提出查询时间以防止永远阻止。