java.util.concurrent) используется для координации потоков, которые выполняют этапы работы (phases). Он позволяет потокам синхронизироваться на каждом этапе, продолжая выполнение только тогда, когда все участвующие потоки завершили текущий этап.Рассмотрим пример, где несколько потоков выполняют 3 этапа работы:
import java.util.concurrent.Phaser;
public class PhaserExample {
public static void main(String[] args) {
// Создаем Phaser для 3 потоков (регистрация)
Phaser phaser = new Phaser(3);
// Запускаем 3 потока
for (int i = 0; i < 3; i++) {
new Thread(new Worker(phaser), "Поток-" + (i + 1)).start();
}
}
}
class Worker implements Runnable {
private final Phaser phaser;
public Worker(Phaser phaser) {
this.phaser = phaser;
}
@Override
public void run() {
try {
for (int phase = 1; phase <= 3; phase++) {
System.out.println(Thread.currentThread().getName() + " выполняет этап " + phase);
// Имитация работы
Thread.sleep(1000);
// Сообщаем о завершении этапа
phaser.arriveAndAwaitAdvance();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
Объяснение:
1️⃣ Создание Phaser:
Phaser phaser = new Phaser(3); — регистрируем 3 участника.2️⃣ Работа потоков: Каждый поток выполняет работу, моделируемую с помощью
Thread.sleep(1000), и вызывает phaser.arriveAndAwaitAdvance() для синхронизации.3️⃣ Синхронизация фаз:
arriveAndAwaitAdvance() — сообщает о завершении текущей фазы и блокируется, пока другие участники не завершат фазу.4️⃣ Количество фаз: Здесь 3 фазы, и каждый поток выполняет все три, прежде чем завершить выполнение.
Пример вывода:
Поток-1 выполняет этап 1
Поток-2 выполняет этап 1
Поток-3 выполняет этап 1
Поток-1 выполняет этап 2
Поток-2 выполняет этап 2
Поток-3 выполняет этап 2
Поток-1 выполняет этап 3
Поток-2 выполняет этап 3
Поток-3 выполняет этап 3
Все потоки синхронизируются после завершения каждого этапа, прежде чем приступить к следующему.
Phaser полезен для задач, где требуется циклическая барьерная синхронизация, например, в обработке нескольких этапов или итерациях вычислений.#java #Phaser
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3