PHpullh

JAVA · 비동기/동시성

Phaser

동적으로 참여자를 추가/제거할 수 있는 유연한 Phaser입니다.

비동기/동시성고급Phaser동기화동적단계

핵심 설명

동적으로 참여자를 추가/제거할 수 있는 유연한 Phaser입니다.

Java code

import java.util.concurrent.*;

public class PhaserDemo {
    public static void main(String[] args) throws Exception {
        // Phaser — 동적 참여자 + 여러 단계
        Phaser phaser = new Phaser(1); // 메인 스레드 등록

        for (int i = 0; i < 3; i++) {
            phaser.register(); // 참여자 등록
            final int id = i;
            new Thread(() -> {
                for (int phase = 0; phase < 3; phase++) {
                    System.out.printf("Worker %d, 단계 %d 작업 중%n",
                        id, phase);
                    try { Thread.sleep(100); } catch (InterruptedException e) {}
                    phaser.arriveAndAwaitAdvance(); // 단계 동기화
                }
                phaser.arriveAndDeregister(); // 완료 후 탈퇴
            }).start();
        }

        // 메인 스레드: 각 단계 완료 확인
        for (int phase = 0; phase < 3; phase++) {
            phaser.arriveAndAwaitAdvance();
            System.out.println("== 단계 " + phase + " 완료 ==");
        }
        phaser.arriveAndDeregister();

        System.out.println("최종 단계: " + phaser.getPhase());
        System.out.println("등록 수: " + phaser.getRegisteredParties());
    }
}

학습 팁

PhaserCyclicBarrier의 상위 호환입니다. 참여자가 동적으로 변하는 시나리오에서 사용하세요.

주의할 점

arriveAndDeregister()를 호출하지 않으면 Phaser가 영원히 대기합니다. 작업 완료 시 반드시 탈퇴하세요.

자주 묻는 질문

Phaser란 무엇인가요?

동적으로 참여자를 추가/제거할 수 있는 유연한 Phaser 입니다.

Phaser 학습 시 주의할 점은 무엇인가요?

arriveAndDeregister() 를 호출하지 않으면 Phaser가 영원히 대기합니다. 작업 완료 시 반드시 탈퇴하세요.