一个Runnable正在悄然死去,最后执行外部,并没有给出任何其他线索.我怎样才能看出导致线程死亡的原因

Joe*_*ger 2 java multithreading

我的代码基本上做了这样的事情:

public void run() {
   try {
      while(true) {
         // Do a bunch of stuff with
         // Kafka and Redis over the 
         // network.
      }
   }
   catch (Exception outerE) {
      System.out.println("I never print this.");
   }
   finally {
      System.out.println("I always print this.");
   }
}
Run Code Online (Sandbox Code Playgroud)

有些事情导致线程死亡,但它没有从while循环中掉出来,并且它没有触发异常,但我确实看到了来自finally的消息.

确定杀死线程的最佳方法是什么?

它在ThreadPoolExecutor下运行,因此我不能只在线程中添加uncaughtExceptionHandler.

只要我可以分配一个,第一个有效的想法就会得到赏金.

编辑:所以"finally"子句让我知道它没有异常就破坏了.我发布这个帖子几个小时后,确实使用了一个自定义线程工厂向线程添加了一个未被捕获的处理程序,结果证明它是一个自我参照Avro记录与Confluent Kafka Schema Registry的致命混合.它导致无限递归并吹出堆栈.

在我的商店,完全不可能将"捕获(Throwable t)"投入生产,因为它被认为是一个坏主意,即使在这种情况下,它正是需要的想法.但是,完全不可能,或者我会尝试过.

fla*_*kes 5

这可能Throwable是一种Error而不是标准Exception

在此输入图像描述

试试这个:

public void run() {
   try {
      while(true) {
         ...
      }
   } catch (final Throwable t) {
      System.out.println("I never print this.");
   } finally {
      System.out.println("I always print this.");
   }
}
Run Code Online (Sandbox Code Playgroud)