Java 线消失得无影无踪

Java 线消失得无影无踪,java,multithreading,concurrency,yield,Java,Multithreading,Concurrency,Yield,我正在调试一个问题。我们很少有线程处理来自BoundedLinkedQueue的数据。处理一条记录后,当前线程执行thread.currentThread().yield() 现在,有一次我们观察到其中一根线消失了!我追踪了日志,发现这样一个“消失”的线程一直工作到yield语句。在此之后,不会找到该线程的任何跟踪,也不会在该线程的最后一个日志附近抛出任何错误或异常 有人能给调试方向指点吗?收益率的用法正确吗?收益率是否可靠?这是因为我发现一篇文章建议避免收益率声明?以前有人见过这种情况吗 编辑

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

现在,有一次我们观察到其中一根线消失了!我追踪了日志,发现这样一个“消失”的线程一直工作到yield语句。在此之后,不会找到该线程的任何跟踪,也不会在该线程的最后一个日志附近抛出任何错误或异常

有人能给调试方向指点吗?收益率的用法正确吗?收益率是否可靠?这是因为我发现一篇文章建议避免收益率声明?以前有人见过这种情况吗

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


    • 产量不会使线程消失。您的线程可能会抛出异常,但该异常未被捕获。你实施了一项新计划吗?如果没有,我建议你这样做。它可以解释您的问题(除非线程自然结束,并且您的代码没有执行您认为应该执行的操作)。

      正如您在链接的文章中指出的,yield没有定义当前量程是否被中断。如果您在线程退出之前就让步,那么调度程序可能会完成线程的量程,从而导致线程立即退出

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

    • 当这种情况再次发生时,我们能够得到一个线程转储,并且该线程似乎永远阻塞了一个JDBC调用——JDBC jar中的一个bug。我们刚刚用最新版本替换了jar,似乎已经解决了这个问题。谢谢大家的宝贵意见,让我学到了很多新东西。另外,现在将查询超时以防止永远阻塞。

      您运行的是什么OS/arch?使用yield的理由?不知道为什么线程会消失,但是yieal是一个静态方法,总是暂停当前线程。您应该使用
      Thread.yield()
      您能发布源代码的示例快照吗code@JVerstry... 谢谢似乎我们没有未捕获的异常处理程序。但是,有一个顶级try-catch块捕获异常对象。不幸的是,这里没有捕获到任何东西。如果您确信您的try/catch得到了很好的实现,那么您的代码很可能不会像您认为的那样执行。否则,我将尝试使用未捕获的异常处理程序。它很容易实现。如果您仍然没有捕获到任何内容,那么您可以确定错误在编码中。线程处理另一条数据。2.在收益率被记录之后没有任何事情发生(这种情况偶尔发生,一些随机线程消失)。即使使用最外层的try/catch语句,我也看不到堆栈跟踪。因此,我添加了uncaughtexceptionhandler,希望现在就捕获它。4.许多人建议通过行为良好的线程使用屈服。JVM管理调度,但根据产量,我们建议调度程序现在可能是接管cpu的好时机。@advantej 3。你如何确定线消失了?4.如果没有经验证据,我不会假设使用收益率会产生更好的结果。5.有多少线程正在从队列中提取数据?6.您是否考虑过让java.util.concurrent包中的ExecutorService管理您的THRED。没有线程的痕迹,也没有线程4完成任务的证据。这是一种遗留代码,可以很好地与大约100名客户合作——这个问题在这对夫妇身上已经看到了。5.不超过15条线。6.不。人们害怕触碰遗留的工作代码:D