카샤의 만개시기

동기화 클래스 4편 - Exchanger 본문

Java/POJO

동기화 클래스 4편 - Exchanger

SKaSha 2019. 7. 3. 16:40

두 쓰레드 간에 인스턴스를 교환해주는 역할로 사용합니다.
예제를 통해서 알아보도록 하겠습니다.
메모리를 할당하는 A 쓰레드메모리를 해제하는 B 쓰레드가 있다고 할 때 A는 자신의 스택에 계속 데이터를 추가하고 쌓여있는 메모리를 해제하기 위해 A는 B와 스택을 교환하게 되고, 그러면 B는 교환 된 스택을 전부 비웁니다.

public final static int MAX_STACK_CNT  = 8;
private Exchanger<LinkedList<Integer>> exchanger = new Exchanger<LinkedList<Integer>>();

class PushThread implements Runnable {
    LinkedList<Integer> stack = new LinkedList<Integer>();

    private Scanner sc = new Scanner(System.in);
    public void run() {
        while(!Thread.interrupted()) {
            try {
                // 스택의 크기를 넘기지 않는 범위에서 입력받은 값들을 스택에 넣는다.
                while(stack.size() < MAX_STACK_CNT) {
                    int value = sc.nextInt();
                    stack.addLast(value);
                }
                // 스택이 가득차면 exchanger 스택과 교환한다
                System.out.println("stack full");
                stack = exchanger.exchange(stack);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class PopThread implements Runnable {
    LinkedList<Integer> stack = new LinkedList<Integer>();
    public void run() {
        while(!Thread.interrupted()) {
            try {
                // 스택에 값이 존재하면 비운다.
                while(!stack.isEmpty()) {
                    int value = stack.removeLast();
                    System.out.println(value);
                }
                // 스택이 비어지면 exchanger 스택과 교환한다
                System.out.println("stack empty");
                stack = exchanger.exchange(stack);
            } catch (InterruptedException e) { 
                e.printStackTrace();
            }
        }
    }
}

public void runThread() {
    new Thread(new PushThread()).start();
    new Thread(new PopThread()).start();
}

실행 결과

stack empty
1
2
3
4
5
6
7
8
stack full
8
7
6
5
4
3
2
1
stack empty

NEXT

동기화 클래스 5편 - Executors, FutureTask, Future

Comments