2013-12-18 2 views
1

나는 결과를 커밋하기 전에 스레드 풀에서 현재 스레드가 실행되고 있지 않은지 확인해야하는 코드를 작성 중이므로 커밋해야하는 데이터가 손실되지 않도록해야합니다.ThreadPoolExecutor의 스레드가 완료되었음을 어떻게 알 수 있습니까?

while (_executor.getActiveCount() > 0) 
{ 
    try 
    { 
    Thread.sleep(10); // milliseconds 
    } 
    catch (InterruptedException e) 
    { 
    // OK do nothing 
    } 
} 

을하지만 동료 getActiveCount에 대한 문서가 주장하는 검토에서 지적 :이를 위해 내가 사용하고

  • 적극적으로 실행
  • 있는 스레드의 대략적인 수를 돌려줍니다 작업.

그래서, 여전히 풀에서 활성 스레드가있는 동안 내가 while 루프 나갈 것입니다 위험이있다? 그렇다면 모든 작업자 스레드가 완료 될 때까지 기다리는 올바른 방법은 무엇입니까?

편집 : 더 많은 컨텍스트를 제공하기 위해 :이 온라인 시스템은 실행 프로그램 서비스가 포함 된 태스크가 무기한으로 실행되는 온라인 시스템입니다. 작업은 메시징 시스템을 통해 이루어지며 실행 프로그램에서 스레드가 실행되며 동기화가 필요하지 않으며 작업이 메시징 시스템의 다른 큐로 나옵니다. 나는 작업 완료를 기다리는 집행자를 죽이고 싶지 않습니다.

+0

당신이 작업의 실행 대신 실행 프로그램 작업없이 일을 기다리고 기다릴 수 있을까요? http://stackoverflow.com/questions/12896755/executorservice-with-invokeall-and-future-in-java – zapl

답변

0

스레드를 정리하고 종료해야한다는 것을 스레드에 알리려면 인터럽트 방법을 사용하십시오. t.interrupt();

캐치 블록에서 오류를 인쇄하거나 로그하는 것이 좋습니다.

1

_executor.awaitTermination();이 작업을 수행해야합니다. 이제 실제로 스레드가 종료 될 때까지 기다리지 않고 사용 가능한 모든 태스크가 종료 될 때까지 기다립니다.

또한 즉시 유휴 스레드를 종료하는 스레드 풀 생성자에 keepAliveTime을 제공 할 수있다 :

ExecutorService executor = new ThreadPoolExecutor(0, 10, 0L /* keepAlive */, 
     TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 
0

작업이 집행자에게 제출되면 작업이 완료 될 때이를 나타내는 Futures를 반환합니다. 그것이 사용하는 기본 메커니즘입니다.

JDK ExecutorService shutdown/awaitTermination을 사용할 수 있습니다.

+0

'Executor의 반환 무효입니다. 'Future'를 얻기 위해서는'CompletionService'를 사용해야합니다. – bstempi

+0

@bstempi'ExecutorService's는'Future'와 void 모두를 반환합니다. 'ExecutorService.submit'는 Runnable과 Callables 모두에 대해 미래를 반환합니다. –

+0

JDK 인터페이스 'ExecutorService'와 모든 구현 클래스는 절대적으로 Futures를 반환합니다. – user2684301

0

사용 사례 : 완료시 풀 스레드의 스레드 - 로컬을 정리해야하며이 정리 작업에 오래 걸릴 수 있습니다 (예 : 연결 닫기). 그 후에 만 ​​메인 스레드가 계속 진행될 수 있습니다.

작업자 스레드는 일부 컬렉션에 자체를 등록 할 수 있습니다.오버라이드 start()run()ThreadPoolExecutor에 사용자 정의 스레드 팩토리를 통과 할 경우 :

class MyThreadFactory implements ThreadFactory { 

    @Override 
    public Thread newThread(final Runnable r) { 
     return new MyThread(r); 
    } 
... 

class Some { 
    void waitAllThreads() { 
     Thread worker; 
     while ((worker = workerThreads.poll()) != null) { 
      worker.join(); 
     } 
    } 
    ... 

class MyThread extends Thread { 

    @Override 
    public synchronized void start() { 
     if (getState() == State.NEW) { 
      some.workerThreads.offer(this); 
     } 
     super.start(); 
    } 

    @Override 
    public void run() { 
     try { 
      super.run(); 
     } finally { 
      some.workerThreads.remove(this); 
     } 
    } 

    ... 
관련 문제