java - 线程池中的异常处理

标签 java exception-handling threadpool

我有一个似乎正在吃异常的 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关于这个问题前一阵子。你有两个选择:

  1. 使用 solution由 Colin Herbert 提供或
  2. 使用 Mark Peters 的修改版本 solution但不是分配 UncaughtExceptionHandler 而是将每个提交的可运行对象包装到您自己的可运行对象中,该可运行对象在 try-catch block 中执行(调用 run)真正的可运行对象。<

编辑
正如 Mark 所指出的,重要的是包装传递给 ScheduledExecutorServiceRunnable 而不是传递给 ThreadFactory 的那个。

关于java - 线程池中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3875739/

相关文章:

java - 函数接口(interface)作为 lambda 来对集合进行排序?

ruby - 在 Ruby 中替代救援?

java - 获取 MongoDB 当前集合名称

java - libgdx AssetManager 无法仅在 html5 上加载资源

c++ - Qt C++ 未处理的异常堆栈跟踪

java - 以负载均衡方式在 4 个线程上分配 10 个无限作业 (Java)

c# - 何时使用 System.Threading.ThreadPool 以及何时使用众多自定义线程池之一?

Java多线程文件保存

java - SWIG - 为具有四个传递字节数组的参数的函数创建类型映射

python - 如何在异常后干净地停止多进程 python 程序?