invokeAll() 을 사용해서 모든 작업이 종료되기를 기다리는 방법도 있지만.. awaitTermination() 를 사용해서 설정된 시간만큼 작업이 종료 되기를 기다리는 방법도 있다.

나름 쓸만한 기능들이 많은듯 싶은데 이거 정말 성능면에서 뛰어 나기는 한걸까? 조금 의문이 듬.

AwaitTerminationTest.java
package study.concurrency.tmp;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class AwaitTerminationTest {

 ExecutorService exec       = Executors.newCachedThreadPool();
 final Queue<String> resultQueue    = new ConcurrentLinkedQueue<String>();
 
 public void test() throws InterruptedException {
  for(int i = 0;i<10;i++)
   exec.execute(new WorkerTask(resultQueue));
  
  exec.shutdown();
 
  // 설정한 시간까지 모든 작업이 종료되기를 기다린다.
  // 설정한 시간이 지나면 해당 스레드는 interrupted 된다.
  boolean isTeminated = exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
 
  // 해당 작업이 종료된 후 출력된다.
  System.out.println("is teminated : " + isTeminated);
 
  for(String s : resultQueue) {
   System.out.println(resultQueue.poll());
  }
 
 }
 
 public static void main(String[] args) {
  try {
   new AwaitTerminationTest().test();
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

WorkerTask.java
package study.concurrency.tmp;

import java.util.Collection;

public class WorkerTask implements Runnable {
 
 final Collection<String> resultQueue;
 
 WorkerTask(final Collection<String> resultQueue) {
  this.resultQueue = resultQueue;
 }
 
 public void run() {
  // TODO Auto-generated method stub
  for(int i = 0;i<5;i++) { 
   resultQueue.add(Thread.currentThread().getName() + " : ["+ i +"]");
   try {
    Thread.sleep(500);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

}    

Posted by 짱가쟁이