Ответ
Phaser — это гибкий синхронизатор из пакета java.util.concurrent, который управляет выполнением потоков в несколько фаз. В отличие от CountDownLatch и CyclicBarrier, он позволяет динамически изменять количество потоков-участников между фазами.
Основные принципы:
- Потоки регистрируются в фазере через
register()илиbulkRegister(). - Основной метод
arriveAndAwaitAdvance()— поток сообщает о прибытии на текущую фазу и блокируется, пока все зарегистрированные потоки не сделают то же самое. - Поток может покинуть пул участников, вызвав
arriveAndDeregister(). - Количество фаз (итераций) не ограничено.
Пример использования:
import java.util.concurrent.Phaser;
public class PhaserExample {
public static void main(String[] args) {
// Создаем Phaser с 3 зарегистрированными сторонами (потоками)
Phaser phaser = new Phaser(3);
for (int i = 0; i < 3; i++) {
final int threadId = i;
new Thread(() -> {
System.out.println("Поток " + threadId + " прибыл на фазу " + phaser.getPhase());
phaser.arriveAndAwaitAdvance(); // Ждем всех
System.out.println("Поток " + threadId + " выполняет работу после фазы " + (phaser.getPhase()-1));
// Второй поток покидает синхронизацию после первой фазы
if (threadId == 1) {
phaser.arriveAndDeregister();
} else {
phaser.arriveAndAwaitAdvance(); // Остальные ждут вторую фазу
}
}).start();
}
}
}
Когда использовать: Для сложных, многоэтапных задач (например, обработка данных), где количество рабочих потоков может меняться на разных этапах.