2011년 6월 13일 월요일

JDK 5.0 java.util.concurrent package - 2

2. Latch
IS ?
Latch는 하나 이상의 비트를 저장하기 위한 디지털 논리회로다. Latch는 하나의 데이터 입력, 하나의 클록 입력, 그리고 하나의 출력을 갖는다. 클록 입력이 활성화 되면, 입력되고 있는 데이터가 입수되어 저장되고, 즉시 또는 클록 입력이 비활성화될 때 출력 측으로 전달된다. 출력은 클록이 다시 활성화 될 때까지 그 값을 유지한다.

CountDownLatch Class
래칭 변수는 한번 설정되면 변하지 않는 상태를 지정한다. 이로인해 여러 개의 쓰레드를 시작할 수 있으며 다른 쓰레드로부터 신호를 받기 전까지 이들을 갖고 있을 수 있다.
래치는 필요한 모든 것이 초기화될 때까지 프로세스가 구동되지 않아야하는, 태스크의 초기(initialization task)에 사용하기 좋으며, 또한 모든 플레이어가 합류할 때까지 게임이 시작되지 않게해야하는 멀티플레이 게임에도 잘 사용된다.

CountDownLatch 클래스는 주어진 숫자로 초기화된 래치를 캡슐화한다. 생성자는 하나의 숫자를 하나의 인수로 취급한다. 숫자는 CyclicBarrier 생성자에 대한 parties argument과 같은 역할을 하는데, 포함된 한 party 당 countDown 메소드가 몇 번 호출되어야 하는지를 나타낸다. 전체 숫자가 세어진 후에는 await 메소드에 의해 대기 중이던 모든 쓰레드가 릴리즈된다.
사용예:
1. 드라이버가 진행 준비를 완료 할 때 까지 워커가 먼저 진행하는 것을 막을 수 있다.
2. 모든 워커가 작업을 완료 할 때 까지 드라이버가 대기 해야 할 때 사용할 수 있다.

아래의 샘플은 두 개의 CountDownLatch을 사용하여 “startLatch”는 Worker Thread의 동시 실행을 위하여 사용되며, “stopLatch”는 동시에 사용된 Worker Thread가 작업을 완료 할 때 까지 드라이버가 대기 할 때 사용된다.
package sun.tips;
import java.util.concurrent.CountDownLatch;
public class Driver {
private static final int COUNT = 10;
private static class Worker implements Runnable {
CountDownLatch startLatch;
CountDownLatch stopLatch;
String name;
Worker(CountDownLatch startLatch,
CountDownLatch stopLatch,
String name) {
this.startLatch = startLatch;
this.stopLatch = stopLatch;
this.name = name;
}
public void run() {
try {
System.out.println(name+" : startLatch.await("+startLatch.getCount()+")");
startLatch.await();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(name+" : Running !!");
stopLatch.countDown();
System.out.println(name+" : stopLatch.countDown("+stopLatch.getCount()+")");
}
}
public static void main(String args[]) {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch stopSignal = new CountDownLatch(COUNT);
for (int i=1; i<=COUNT; i++) {
new Thread(
new Worker(startSignal, stopSignal, "Worker Name : "+i)).start();
}
System.out.println("Go");
startSignal.countDown();
try {
System.out.println("StopSignal Waint !!");
stopSignal.await();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Done");
}
}


결과
Worker Name : 1 : startLatch.await(1)
Worker Name : 2 : startLatch.await(1)
Worker Name : 3 : startLatch.await(1)
Worker Name : 4 : startLatch.await(1)
Worker Name : 5 : startLatch.await(1)
Worker Name : 6 : startLatch.await(1)
Worker Name : 7 : startLatch.await(1)
Worker Name : 8 : startLatch.await(1)
Worker Name : 9 : startLatch.await(1)
Worker Name : 10 : startLatch.await(1)
Go
Worker Name : 1 : Running !!
Worker Name : 1 : stopLatch.countDown(9)
Worker Name : 2 : Running !!
Worker Name : 2 : stopLatch.countDown(8)
Worker Name : 3 : Running !!
Worker Name : 3 : stopLatch.countDown(7)
Worker Name : 4 : Running !!
Worker Name : 4 : stopLatch.countDown(6)
Worker Name : 5 : Running !!
Worker Name : 5 : stopLatch.countDown(5)
Worker Name : 6 : Running !!
Worker Name : 6 : stopLatch.countDown(4)
Worker Name : 7 : Running !!
Worker Name : 7 : stopLatch.countDown(3)
Worker Name : 8 : Running !!
Worker Name : 8 : stopLatch.countDown(2)
Worker Name : 9 : Running !!
Worker Name : 9 : stopLatch.countDown(1)
Worker Name : 10 : Running !!
Worker Name : 10 : stopLatch.countDown(0)
StopSignal Waint !!
Done


CountDownLatch Class의 Method
await()
latch의 카운트 다운이 0이 될 때까지 현재의 Thread를 대기 시킨다.
await(long timeout,
TimeUnit unit)
지정된 대기 시간동안 latch의 카운트 다운이 0이 될 때 까지 현재의 Thread을 대기 시킨다.
countdown()latch의 카운트을 감산해, 카운트가 0이 되면 대기 Thread을 해방한다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...