ExecutorService
的javadoc有时会提到线程由于“失败”而终止的情况。然而,这种失败指的是什么类型并不清楚。
例如,单线程执行器文档表示:
如果该单个线程在关闭之前由于执行过程中的故障而终止,则如果需要执行后续任务,将会有一个新线程取代它。
我原以为这种情况可能发生在异常或者RuntimeException
的情况下,但事实似乎并非如此。运行以下代码似乎会给出相同的线程名称和线程ID。
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
System.out.println("Hello from " + Thread.currentThread().getName()+ " " + Thread.currentThread().getId());
throw new NullPointerException("Test");
});
executor.submit(() -> {
System.out.println("Hello 2 from " + Thread.currentThread().getName() + " " + Thread.currentThread().getId());
});
这段代码的输出结果是:
Hello from pool-1-thread-1 12
Hello 2 from pool-1-thread-1 12
似乎即使在NullPointerException
的情况下,同一线程也被重复使用。
Javadoc所指的“失败”是什么类型的?