Java/POJO
동기화 클래스 3편 - CyclicBarrier
SKaSha
2019. 7. 3. 16:21
실행중인 쓰레드 내부 원하는 지점에서 대기를 걸어주고 CyclicBarrier 생성자의 파라미터로 넘겨준 값 만큼 await()
을 호출하면 대기하고 있던 쓰레드들의 대기를 풀어주는 동작을 할 수 있습니다.
private static final int THREAD_CNT = 5;
private CyclicBarrier cyclicBarrier = new CyclicBarrier(THREAD_CNT);
public class SleepThread implements Runnable {
private int id = 0;
private Random random = new Random(System.currentTimeMillis());
public SleepThread(int id) {
this.id = id;
}
@Override
public void run() {
System.out.println("Thread(" + id + ") : Start.");
int delay = random.nextInt(1001) + 1000; // 1 ~ 2초
try {
System.out.println("Thread(" + id + ") : Sleep " + delay + "ms");
Thread.sleep(delay);
System.out.println("Thread(" + id + ") : End Sleep"); } catch (InterruptedException e) {
e.printStackTrace();
}
try {
// CyclicBarrier 생성자의 파라미터로 넘겨준 값 만큼 await를 호출한다면
// barrier를 통해 대기하고 있는 모든 쓰레드의 wait 상태가 종료됩니다.
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("Thread(" + id + ") : End.");
}
public static void main(String[] args) {
for(int i = 0; i < THREAD_CNT; ++i) {
new Thread(new SleepThread(i)).start();
}
}
결과
Thread(0) : Start.
Thread(2) : Start.
Thread(2) : Sleep 1229ms
Thread(0) : Sleep 1132ms
Thread(1) : Start.
Thread(1) : Sleep 1784ms
Thread(4) : Start.
Thread(3) : Start.
Thread(4) : Sleep 1912ms
Thread(3) : Sleep 1199ms
Thread(4) : End Sleep
Thread(2) : End Sleep
Thread(3) : End Sleep
Thread(1) : End Sleep
Thread(0) : End Sleep
Thread(4) : End.
Thread(3) : End.
Thread(1) : End.
Thread(2) : End.
Thread(0) : End.