2013-04-18 2 views
12

ExecutorService#shutdown 메서드의 javadoc에 대해 혼란스러워합니다. 이 모순 된 진술이 아닌가?ExecutorService shutdown

이전에 제출 한 작업이 인 실행을 순서대로 종료하지만 새 작업은 허용되지 않습니다. 이 메서드는 실행을 완료하기 위해 이전에 제출 된 작업에 대해 을 기다리지 않습니다. 이를 수행하려면 awaitTermination을 사용하십시오.

이전에 제출 한 작업을 정상적으로 종료 할 수 있다면 실행이 완료 될 때까지 기다릴 수 없습니다.

+0

주석은 이전 작업이 삭제되지 않는다는 것을 의미합니다. 그들은 즉시 처형 될 것입니다. 'awaitTermination()'을 사용하십시오. –

+0

루틴은 모든 태스크가 완료되기를 기다리는 대신 거의 즉시 반환됩니다. –

답변

13

즉,이 메서드는 호출 한 스레드에서 즉시 반환되지만 아직 실행되지 않은 작업은 다른 스레드에서 계속 실행 중일 수 있습니다.

이전에 제출 한 작업이 완료 될 때까지 프로그램을 대기 시키려면 shutdown을 호출 한 후 awaitTermination으로 전화해야합니다.

+0

정확히 두 가지 문제점을 구분합니다. 기다리지 않고 종료하려는 경우가있을 수 있습니다. – user1225148

+0

awaitTermination()을 ExecutorService 인스턴스에서 .join()을 호출하는 것과 같은 것으로 상상할 수 있습니까? awaitTermination()을 호출하지 않으면이 경우 주 스레드 (또는 호출자 스레드)가 ExecutorService 스레드와 동시에 계속됩니다. awaitTermination()을 호출하면 주 스레드는 ExecutorService 스레드가 완료 될 때까지 실행을 중지합니다. 제 이해가 정확한지 확인해주십시오. – RuntimeException

6

작업이 완료 될 때까지 실행되지만이 메서드는 작업이 완료 될 때까지 기다리지 않고 즉시 반환됩니다.

그래서, 어떤 작업을 죽이지 않고 정상적으로 종료 당신의 집행을에, 당신은 할 것이다 : 당신은 그냥 최대한 빨리 집행을 중지하려면

executor.shutdown(); 
executor.awaitTermination(long timeout, TimeUnit unit); 

는 또한, shutdownNow()을 사용합니다.