Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое монитор Phaser?
Пhaser — это синхронизатор из пакета java.util.concurrent, который позволяет потокам синхронизироваться в определённых точках программы. Это многоразовый барьер, через который должно пройти фиксированное количество потоков перед тем, как продолжить выполнение.
Основные характеристики
Отличие от других синхронизаторов:
- CountDownLatch работает в одном направлении (один раз), Phaser многоразовый
- CyclicBarrier похож, но Phaser более гибкий и имеет фазы
- Phaser поддерживает динамическое добавление/удаление потоков
Основные методы
Phaser phaser = new Phaser(3); // 3 участника
// Регистрация нового участника
phaser.register();
// Ожидание других потоков (await barrier)
int phase = phaser.arriveAndAwaitAdvance();
// Сообщение о завершении фазы без ожидания
phaser.arriveAndDeregister();
// Только сообщить о прибытии
phaser.arrive();
// Проверить текущую фазу
int currentPhase = phaser.getPhase();
Пример использования
public class PhaserExample {
public static void main(String[] args) {
Phaser phaser = new Phaser(1); // Начинаем с одного участника (main thread)
// Запускаем 3 рабочих потока
for (int i = 1; i <= 3; i++) {
phaser.register(); // Добавляем участника
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " фаза 1");
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " фаза 2");
phaser.arriveAndAwaitAdvance();
System.out.println(Thread.currentThread().getName() + " завершено");
phaser.arriveAndDeregister();
}).start();
}
// Main thread тоже участвует
phaser.arriveAndDeregister();
}
}
Практическое применение
- Волновая обработка данных — несколько этапов обработки, каждый этап начинается когда завершены все предыдущие
- Многоэтапные тесты — синхронизация нескольких тестовых потоков
- Параллельные вычисления — map-reduce паттерны где нужна барьерная синхронизация между фазами
Важные особенности
- Динамичность — можно регистрировать/удалять потоки на ходу
- Фазовость — автоматически переходит на следующую фазу когда все потоки прибыли
- Оверлоад onAdvance() — можно переопределить поведение при переходе между фазами
- Аварийное завершение — forceTermination() для экстренной остановки
Phaser идеален когда нужна гибкая синхронизация нескольких потоков с поддержкой переходов между фазами.