2011-09-21 5 views
1

일부 작업을 처리하는 ExecutorService이 있습니다. 클라이언트 스레드 일 수 있으며 ExecutorServiceshutdown()으로 호출 할 수 있습니다. ExecutorService이 완전히 종료 된 후에 정리 코드를 실행하고 싶습니다. ExecutorService이 종료를 완료 한 후 콜백 메소드를 실행하는 메커니즘이 있습니까?ExecutorService의 종료 시간 결정

참고 :

  1. 내가 하지 전화 shutdownNow()
  2. 클린 업 코드가 shutdown()이 완료 후 를 실행해야 할 수 있습니다.
  3. ExecutorServicenewCachedThreadPoolExecutor()이고;

답변

1

나는 확장을 무시할 것 :

public class MyExecutorService extends ThreadPoolExecutor { 
    @Override 
    public void shutdown() { 
     super.shutdown(); 
     // do what you need to do here 
    } 
} 

+0

전체'ExecutorService'가 시스템 종료를 마친 후에 대신 'shutdown()'을 처음 호출 할 때 코드를 실행하지 않겠습니까? –

+0

확장하고 재정의해야하는 이유는 무엇입니까? 왜 직접 호출하지 말아야합니까? –

2

시작으로 뭔가 다른 스레드/집행 관리 - 실행 가능한 루프에서 시도-catch 문에서 확인 ExecutorService.awaitTermination(...) 그것은 돌아올 때까지 true을 입력 한 다음 종료 처리 코드를 실행하십시오. 인터럽트 될 때 메소드가 조기에 리턴 할 수 있기 때문에 루프가 필요합니다. 이 같은

뭔가 :

public class ShutdownHandler implements Runnable { 

    private final ExecutorService service; 

    public ShutdownHandler(final ExecutorService service) { 
     this.service = service; 
    } 

    @Override 
    public void run() { 
     boolean terminated = false; 
     while (!terminated) { 
      try { 
       terminated = service.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 
      } catch (final InterruptedException ex) { 
       // check again until terminated 
      } 
     } 

     // your shutdown handling code here 
    } 
} 
+0

이렇게하면 작업을 실행 프로그램에 제출하는 스레드에서 정리 코드 *를 비동기 적으로 실행할 수 있습니다. * 동기 * 방식으로 @ Andrei의 대답을 확인하십시오. –

1

글쎄, 당신은) 모든 작업이 완료 될 때까지 차단됩니다 스레드 호출 executorService.invokeAll (myListOfCallableTasks) 그들을 executorService.shutDown (호출하는 경우 :

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#invokeAll(java.util.Collection)

+0

호출 스레드를 차단할 수있는 매우 우아한 방법입니다. 그 중 하나를 생각하지 않았다 :) –

+1

@PhilippReichart 그냥 ScheduledExecutorService를 사용하면이 접근 방식이 작동하지 않을 것이라는 관찰. – IceMan

+0

@PhilippReichart : 동의 함. 그걸 몰랐는데, 업데이트 주셔서 감사합니다. –

관련 문제