2010. 6. 29. 17:39
invokeAll() 을 사용해서 모든 작업이 종료되기를 기다리는 방법도 있지만.. awaitTermination() 를 사용해서 설정된 시간만큼 작업이 종료 되기를 기다리는 방법도 있다.
나름 쓸만한 기능들이 많은듯 싶은데 이거 정말 성능면에서 뛰어 나기는 한걸까? 조금 의문이 듬.
AwaitTerminationTest.java
WorkerTask.java
나름 쓸만한 기능들이 많은듯 싶은데 이거 정말 성능면에서 뛰어 나기는 한걸까? 조금 의문이 듬.
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();
}
}
}
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();
}
}
}
}
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();
}
}
}
}
'java > concurrency' 카테고리의 다른 글
[우선순위 큐] - PriorityBlockingQueue 샘플 (0) | 2012.02.13 |
---|---|
[Concurrency] - java.util.concurrent.locks.Condition (0) | 2010.06.29 |
[Concurrency] - LOCK(락) - ReentrantReadWriteLock(2) (0) | 2010.06.29 |
[Concurrency] - LOCK(락) - ReentrantReadWriteLock(1) (0) | 2010.06.29 |
[Concurrency] - ExecutorService 의 invokeAll() 사용하기 (0) | 2010.06.29 |