2011-11-17 3 views
1

명령 줄 응용 프로그램이 있습니다. 루프를 100 번 실행하고 루프에서 스레드를 사용하여 작업을 예약합니다. 언제든지 실행중인 4 개의 스레드가 있으므로 ExecutorService를 사용하고 있습니다.풀의 모든 스레드가 완료된 후에 요약 메시지를 인쇄하는 방법은 무엇입니까?

루프가 끝난 후 요약 메시지를 인쇄하려고합니다. 예 : 100 개의 모든 작업을 완료하는 데 걸리는 시간. 코드를 밟았을 때 디버거는 요약 부분으로 곧바로 갔지만 다른 작업은 여전히 ​​실행 중입니다. 나는 각 스레드가 자체적으로 실행되기 때문에 이것이라고 생각합니다. 그렇다면 모든 스레드가 완료된 후에 만 ​​메시지를 인쇄하려면 어떻게해야합니까?

ExecutorService exec = Executors.newFixedThreadPool(4); 

long startTime = System.currentTimeMillis(); 

for (int i = 0; i < 100; i++) { 

    Runnable requestHandler = new Runnable() { 
     @Override 
     public void run() { 
      try { 
       // call task function in here 
      } catch (Exception ex) { 
      } 
     } 
    }; 
    exec.execute(requestHandler); 
} 

exec.shutdown(); 

long endTime = System.currentTimeMillis(); 

LOGGER.info("******************SUMMARY******************"); 
LOGGER.info("Time taken : " + ((endTime - startTime)/1000) + " seconds, " 
          + ((endTime - startTime)/1000/60) + " minutes"); 
+0

더 많은 검색 결과가 있습니다. 나는 CountDownLatch를 사용하여 끝내었다. 예를 들어 http://www.javamex.com/tutorials/threads/CountDownLatch.shtml – user373201

답변

3

exec.shutdown();exec 선언에 이르기까지 모든 작업을 수행 다른 스레드를 만들 수 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html 예를 메인 스레드에서 간결

void shutdownAndAwaitTermination(ExecutorService pool) { 
    pool.shutdown(); // Disable new tasks from being submitted 
    try { 
    // Wait a while for existing tasks to terminate 
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     // Wait a while for tasks to respond to being cancelled 
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) 
      System.err.println("Pool did not terminate"); 
    } 
    } catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    pool.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
    } 
} 
+0

빠른 응답 주셔서 감사합니다 – user373201

+0

건배 :) ............. –

1

기본적으로 ExecutorService isTerminated() 메서드가 true를 반환 할 때까지 기다려야합니다. 그 목적으로 awaitTermination()을 사용할 수 있습니다.

5

에 대한 복사를 참조하십시오. 이 스레드를 만든 후에는 주 스레드를 wait에 넣습니다. 새 스레드의 동작이 끝나면 (exec.shutdown(); 이후) notify이어야합니다. 당신의 코드를 기반으로 당신을 위해

0

솔루션 :

ExecutorService exec = Executors.newFixedThreadPool(4); 
long start = System.currentTimeMillis(); 
//Your code 
exec.shutdown(); 
while(true) { 
    if(exec.isTerminated()) { 
    long end = System.currentTimeMillis(); 
    System.out.println("Time : " + (end - start)); 
    break; 
    } 

확인이 아웃! 그것은 작동합니다!

관련 문제