我有一个似乎正在吃异常的 ScheduledThreadPoolExecutor。如果提交的 Runnable 引发异常,我希望我的 executor 服务通知我。
例如,我希望下面的代码至少打印 IndexArrayOutOfBoundsException 的 stackTrace
threadPool.scheduleAtFixedRate(
new Runnable() {
public void run() {
int[] array = new array[0];
array[42] = 5;
}
},
1000,
1500L,
TimeUnit.MILLISECONDS);
作为一个附带问题。有没有办法为 ScheduledThreadPoolExecutor 编写一个通用的 try catch block ?
/////////原始问题结束/////////////
按照建议,以下装饰器效果很好。
public class CatcherTask implements Runnable{
Runnable runMe;
public CatcherTask(Runnable runMe) {
this.runMe = runMe;
}
public void run() {
try {
runMe.run();
} catch (Exception ex){
ex.printStackTrace();
}
}
}
最佳答案
我写了一个小post关于这个问题前一阵子。你有两个选择:
- 使用 solution由 Colin Herbert 提供或
- 使用 Mark Peters 的修改版本 solution但不是分配
UncaughtExceptionHandler
而是将每个提交的可运行对象包装到您自己的可运行对象中,该可运行对象在 try-catch block 中执行(调用run
)真正的可运行对象。<
编辑
正如 Mark 所指出的,重要的是包装传递给 ScheduledExecutorService
的 Runnable
而不是传递给 ThreadFactory
的那个。
关于java - 线程池中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3875739/