在自定义线程中处理RunTimeException

时间:2018-06-16 10:14:47

标签: java android multithreading

After throwing a RunTimeException in a custom thread the thread stopped (like a dead lock) and nothing was loged

But when I throw the RunTimeException in the renderer thread everything works fine

我花了一整天的时间试图找出线程停止的原因后发现了这一点。事业证明是一个简单的IndexOutOfBondException。如果在logcat中显示异常,我会在一分钟内解决这个问题。任何人都可以告诉我为什么在自定义线程中抛出异常会导致线程停止,如何捕获并记录它?

我使用ExecutorService来创建和处理我的自定义线程。

private ExecutorService processingThread = Executors.newSingleThreadExecutor(r -> new Thread(r, "processingThread"));

我使用android studio。

第二个屏幕截图中的代码位于onDrawFrame()中的GLRenderer函数内。

第一个屏幕截图中的代码位于提交函数中的lambda thingy内,该函数位于onDrawFrame()中的GLRenderer函数中(原谅我的英文)。

非常感谢

1 个答案:

答案 0 :(得分:1)

您无法直接在主线程中捕获Thread中的异常。

线程即将因未捕获的异常而终止

  
      
  1. Java虚拟机将使用Thread.getUncaughtExceptionHandler()在线程中查询其UncaughtExceptionHandler   并将调用处理程序的uncaughtException方法,传递   线程和异常作为参数。
  2.   
  3. 如果某个线程没有明确设置其UncaughtExceptionHandler,   然后它的ThreadGroup对象充当其UncaughtExceptionHandler。
  4.   
  5. 如果ThreadGroup对象没有特殊的处理要求   例外,它可以将调用转发到默认的未捕获   异常处理程序。
  6.   

您可以从线程中捕获运行时异常,如下所示:

Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
    public void uncaughtException(Thread th, Throwable ex) {
       Log.e("TEST","Uncaught exception: " + ex);
    }
};
final Thread thread = new Thread() {
    public void run() {
        Log.d("TEST","Performing action...");
        throw new RuntimeException("Exception from thread");
    }
};
thread.setUncaughtExceptionHandler(h);
thread.start();