2014-09-20 70 views
2

我向Executors.newFixedThreadPool(3)提交了一些任务,它们都运行并成功完成。然后,我打电话ExecutorService终止,但JVM没有

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

通过

executorService.isShutdown() 
executorService.isTerminated() 

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

终结者可能是主要的嫌疑人,如果它不是deamon线程。我暂停两个线程得到这个图像

godot

实际上,我很期待池中的线程将早已不复存在,因为isTerminated == true。任何想法,他们都在等待谁?

+0

您确定您没有其他服务以某种方式运行吗?我看到这是池-2。 – dcernahoschi 2014-09-20 09:40:25

+0

@dcernahoschi我笨了......我忘了添加['@ Singleton'](http://google-guice.googlecode.com/git-history/3.0/javadoc/com/google/inject/Singleton.html)到我的服务包装。所以我关闭了一个游泳池,另一个停留了。也许我应该删除这些问题,但是,其他人可能会从中获利。请注意添加答案? – maaartinus 2014-09-20 16:06:39

回答

1

从您的调试图像看来,您的服务并不孤单,因为它的名称为pool-2。因此,您可能仍有另一个ExecutorService作为pool-1运行,以防止JVM退出。

0

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

另外你应该调用System.exit(..),它最终会终止你的JVM。

+0

我已经尝试'shutdownNow()'已经没有帮助。当然,'System.exit'有效,但感觉不对。 – maaartinus 2014-09-20 07:15:31