카샤의 만개시기

동기화 클래스 2편 - CountDownLatch 본문

Java/POJO

동기화 클래스 2편 - CountDownLatch

SKaSha 2019. 7. 3. 16:09

백그라운드로 스레드가 돌아가고 있는 상황에서 해당 스레드가 종료 되기를 기다려야 하는 상황이 있을때 Thread 클래스의 join() 함수를 이용하면 됩니다.
그렇지만 하나가 아닌 여러 스레드들이 종료되기를 기다려야 하는 상황이 발생된다면 CountDownLatch를 고려할 수 있습니다.

private static final int THREAD_CNT = 10; 
private CountDownLatch lacth = new CountDownLatch(THREAD_CNT);

public class SleepThread implements Runnable {
    private int id = 0;
    private static 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);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Thread(" + id + ") : End.");
        lacth.countDown();    // latch count -1 
    }
}

public static void main(String[] args) {
    for(int i = 0; i <= THREAD_CNT; i++) {
        new Thread(new SleepThread(i)).start();
    }
        try {
        // lacth 의 카운트가 0이 될 때 까지 대기.
        lacth.await();
        // 아래 코드는 만약 3초 동안 latch 의 카운트가 0 되지 않는다면 wait 상태를 해제한다.
        //lacth.await(3000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

결과

Thread(1) : Start.
Thread(1) : Sleep 1114ms
Thread(2) : Start.
Thread(0) : Start.
Thread(0) : Sleep 1222ms
Thread(2) : Sleep 1023ms
Thread(5) : Start.
Thread(4) : Start.
Thread(4) : Sleep 1332ms
Thread(5) : Sleep 1678ms
Thread(3) : Start.
Thread(3) : Sleep 1499ms
Thread(6) : Start.
Thread(6) : Sleep 1721ms
Thread(7) : Start.
Thread(8) : Start.
Thread(7) : Sleep 1004ms
Thread(8) : Sleep 1722ms
Thread(9) : Start.
Thread(9) : Sleep 1676ms
Thread(7) : End.
Thread(1) : End.
Thread(2) : End.
Thread(0) : End.
Thread(3) : End.
Thread(4) : End.
Thread(8) : End.
Thread(5) : End.
Thread(9) : End.
Thread(6) : End.

NEXT

동기화 클래스 3편 - CyclicBarrier

Comments