我正在使用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);
}