2014-10-28 5 views
1

다음 동작을 명확하게 설명해야합니다. 다음과 같이java executor 서비스 종료 및 awaitTermination에 대한 이해

나는

위의 코드에서
 for (int i = 0; i < thread_count; i++) { 
      Runnable worker = new MyThread(batchSize); 
      executor.execute(worker); 
     } 

     executor.shutdown(); 
     executor.awaitTermination(15, TimeUnit.MINUTES); 
     System.out.println("All threads are finished"); 

나는 5 개 스레드가 그 10 분으로 완성되고 그것은 executor.awaitTermination(15, TimeUnit.MINUTES) 15 분 대기 시간에도-불구하고, System.out.println("All threads are finished")를 실행, java.util.concurrent.ExecutorService와 자바 응용 프로그램을 .

그러나 executor.shutdown()을 제거하면 다음 줄을 실행하기 전에 프로그램에서 executor.awaitTermination(15, TimeUnit.MINUTES) 문에 지정된 15 분을 기다립니다.

아무도이 동작을 설명 할 수 있습니까? shutdown 명령을 사용하지 않으면 모든 스레드가 완료 되어도 지정된 시간 동안 기다리는 이유는 무엇입니까?

+0

하시기 바랍니다 항상 읽고 사용하고있는 모든 메소드의 JavaDoc을 이해하려고 노력 . –

+0

awaitTermination의 "종료"는 새 작업이 항상 발생할 수있는 시나리오를 염두에두고 설계 되었기 때문에 작업 종료가 아니라 스레드 풀의 종료를 의미합니다. – lbalazscs

답변

1

ExecutorService.awaitTermination를위한 Javadoc는 말한다 :

블록 슛 다운 요구 후에 모든 태스크가 실행을 완료했거나, 첫를 발생 중 을 제한 시간은 발생, 또는 현재의 thread가 이 중단 될 때까지 .

그래서 shutdown()을 호출하면 스레드가 10 분 내에 종료됩니다. 그런 다음 awaitTermination이 즉시 반환됩니다 (15 분을 기다리지 않고).

그러나 제한 시간이 경과 할 때까지 awaitTermination은 (15 분)를 반환하지 않도록 당신이 종료(), 더 종료 요청이, 없다에 대한 호출을 제거하면

0

ExecutorService은 그에게 넘겨주는 모든 작업을 즉시 시작합니다.

으로 인해 ExecutorService은 새 작업 수락을 중지하고 작업을 완료합니다 (지금까지 시작되지 않은 이전에 제공된 모든 작업 시작).

ExecutorService#awaitTermination의 인수는 강제 종료되기까지이 호출이 차단할 시간 제한 인 시간 초과입니다.

shutdown()으로 전화하지 않고 Executor 자체가 새로운 작업을 영원히 기다릴 것이기 때문에 awaitTermination()으로 전화하면 제공된 전체 시간 동안 차단됩니다.

1

ExecutorService.awaitTermination 방법 상태의 자바 독 :

블록 모든 작업을 종료 요청 후 실행을 완료했거나, 둘 중 먼저 발생 를 타임 아웃이 발생하는지, 현재의 스레드가 중단 될 때까지.