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());
}
}학습 팁
Phaser는 CyclicBarrier의 상위 호환입니다. 참여자가 동적으로 변하는 시나리오에서 사용하세요.
주의할 점
arriveAndDeregister()를 호출하지 않으면 Phaser가 영원히 대기합니다. 작업 완료 시 반드시 탈퇴하세요.
자주 묻는 질문
Phaser란 무엇인가요?
동적으로 참여자를 추가/제거할 수 있는 유연한 Phaser 입니다.
Phaser 학습 시 주의할 점은 무엇인가요?
arriveAndDeregister() 를 호출하지 않으면 Phaser가 영원히 대기합니다. 작업 완료 시 반드시 탈퇴하세요.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.