2016-01-14 57 views
1

我试图崩溃的标准ExecutorService这个可怕的代码固定的线程池的线程,以测试其对异常和错误传递给ExecutorService任务中发生了弹性:有没有办法无意中停止Executor的线程?

ExecutorService executorService = Executors.newFixedThreadPool(1); 
    executorService.execute(() -> { 
     throw new RuntimeException("Trying to kill the thread"); 
    }); 
    Thread.sleep(100); 
    executorService.execute(() -> { 
     System.out.println("still executing"); 
    }); 

但第二任务打印still executing,所以我认为异常被捕获或Thread实例重新启动。 发生了什么?我可以相信,不管在任务内发生了什么(小于System.exit()),其他提交的任务将继续由池执行吗?

+5

这是正确的,在这你应该阅读的API文档。 “如果任何线程在关闭之前的执行期间由于失败而终止,那么如果需要执行后续任务,则新线程将取代它的位置。池中的线程将一直存在,直到它被明确关闭。 – pvg

+1

这不是可怕的代码,这是一个_learning test_。如图所示,它只是一个手动测试,但您可以将其自动化,并将其作为某个应用程序的单元测试套件的一部分,以便记录应用程序依赖于该行为。 –

回答

3

您的执行者服务使用线程池。如果一个线程被杀死,另一个将被实例化以执行下一个任务。

您的电话Executors.newFixedThreadPool(1);仅设置活动线程数的限制。

为了停止执行的服务,你必须调用:

executorService.shutdown(); 
+0

或'executorService.shutDownNow()'。 – OldCurmudgeon

相关问题