카샤의 만개시기

동기화 클래스 3편 - CyclicBarrier 본문

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.
Comments