2014-09-20 2 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입니다.

파이널 라이저는 데몬 스레드가 아닌 경우 주요한 용의자가 될 수 있습니다. 나는 풀 스레드가 긴 때문에 isTerminated == true의 사라 할 기대,

godot

사실이 이미지를 얻기 위해 두 개의 스레드를 중단. 그들 모두가 누구를 기다리는 지 아십니까?

+0

어떻게 든 다른 서비스를 실행하지 않습니까? 나는 이것이 pool-2라는 것을 알았다. – dcernahoschi

+0

@dcernahoschi Me stupid ... ['@ Singleton'] (http://google-guice.googlecode.com/git-history/3.0/javadoc/com/google/inject/Singleton.html)을 추가하는 것을 잊어 버렸습니다. 서비스에 대한 나의 래퍼에게. 그래서 나는 한 수영장을 닫고 다른 한 마리는 머물렀다. 어쩌면이 질문을 삭제해야하지만, 다른 사람들이 내가 가질 수있는만큼 이익을 얻을 수 있습니다. 대답을 추가 하시겠습니까? – maaartinus

답변

1

디버그 이미지에서 pool-2이라는 이름의 서비스가 단독으로 사용되지 않는 것 같습니다. 따라서 다른 ExecutorService을 계속 실행하여 pool-1으로 설정하면 JVM이 종료되지 않습니다.

0

awaitTermination (..) 후에 service를 올바르게 닫으려면 executorService.shutdownNow()를 호출해야 할 것입니다.

또한 JVM을 결국 종료시키는 System.exit (..)을 호출해야합니다.

+0

'shutdownNow()'를 이미 시도했지만 아무런 도움이되지 않았습니다. 물론,'System.exit'은 작동하지만, 옳다고 생각하지는 않습니다. – maaartinus

관련 문제