ExecutorService终止,但JVM没有

时间:2014-09-20 06:51:03

标签: java multithreading executorservice

我向Executors.newFixedThreadPool(3)提交了一些任务,它们都成功运行并完成。然后我打电话给

executorService.shutdown();
executorService.awaitTermination(2000, TimeUnit.MILLISECONDS);

通过

检查
executorService.isShutdown()
executorService.isTerminated()

然后再回来两次。主线程退出,但JVM保持活动状态。没有AWT线程或类似的,我只能看到3个池线程,DestroyJavaVMcom.google.inject.internal.util.$Finalizer

如果不是一个守护线程,终结者可能是主要的嫌疑人。我暂停了两个线程来获取此图像

godot

实际上,由于isTerminated == true,我希望池线程早已消失。知道谁都在等他们?

2 个答案:

答案 0 :(得分:1)

从您的调试图像看来,您的服务并不是唯一的,因为它的名称为pool-2。因此,您可能还有另一个ExecutorService仍在运行pool-1,阻止JVM退出。

答案 1 :(得分:0)

我猜你必须在awaitTermination(..)之后调用executorService.shutdownNow()来正确关闭服务。

此外,您应该调用System.exit(..),它最终将终止您的JVM。