Runnable中的异常未被捕获,Executor将挂起

时间:2015-10-25 19:34:26

标签: java executorservice threadpoolexecutor

我正在使用FixedThreadPool来运行许多线程。方法doJobs()有时会抛出一个运行时异常,其堆栈跟踪在控制台上打印但未记录。这意味着catch(Throwable)中的MyRunnable未捕获此异常。主要问题是,在此异常之后,Executor将停止执行已提交的任何线程,整个应用程序将挂起。怎么可能没有记录这个异常?另外,为什么整个执行程序不会继续并且没有完成但只是挂起而没有活动?

class MyRunnable implements Runnable {
    public void run() { 
        try {
            doJob();
        }
        catch(Error e){ log(e);}
        catch(Throwable e) {log(e);}
    }
}

//main method
final ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);
for (final MyRunnable wc : runnables) {
    executor.execute(wc);
}
try {
    executor.awaitTermination(maxTime, TimeUnit.HOURS);
} catch (final InterruptedException e) {
    throw new RuntimeException(e);
}

0 个答案:

没有答案