Связанное чтение:
Параллельное программирование на Java (1) Карта знаний
Параллельное программирование на Java (2) Атомарность
Параллельное программирование на Java (3) Видимость
Параллельное программирование на Java (4) упорядоченность
Параллельное программирование на Java (5) Обзор создания потоков
Введение в параллельное программирование на Java (6) синхронизированное использование
Введение в параллельное программирование на Java (7) Простое понимание сценариев ожидания, уведомления и использования
Введение в параллельное программирование на Java (8) Жизненный цикл потока
Введение в параллельное программирование на Java (9) Тупик и бит тупика
Введение в параллельное программирование на Java (10) Оптимизация блокировок
Введение в параллельное программирование на Java (11) Сценарий ограничения тока и реализация Spring Current Limiter
Введение в параллельное программирование на Java (12) Шаблоны производителей и потребителей — шаблоны кода
Введение в параллельное программирование на Java (13) Блокировки чтения-записи и шаблоны кэширования
Введение в параллельное программирование на Java (14) Сценарий приложения CountDownLatch
Введение в параллельное программирование на Java (16) Понимание различий в пулах потоков за считанные секунды
Введение в параллельное программирование на Java (17) Изображение для освоения общих классов и интерфейсов потоков
Введение в параллельное программирование на Java (18) Повторное обсуждение безопасности потоков
Введение в параллельное программирование на Java (19) Инструмент планирования асинхронных задач CompleteFeature
Введение в параллельное программирование на Java (20) Общие сценарии блокировки и инструменты блокировки
1. Сценарии применения
В реальной жизни таких сценариев много: прежде чем делать F, нужно дождаться завершения A, B, C, D, E, A, B, C, D, E можно выполнять одновременно, в произвольном порядке, и после того, как F выполнен, он перезапускается.Для запуска, например: шины, двери, кузов и т. д. должны быть изготовлены до сборки автомобиля. Особенности этой сцены:
1. Перед сборкой автомобиля нужно сделать N вещей, а собрать машину можно только после того, как все будет сделано.
2. Каждая вещь может обрабатываться параллельно, нет последовательности, что повышает эффективность.
3. Собрав один автомобиль, продолжайте производить и собирать следующий. (Конечно, все детали теперь производятся серийно, а не по одной. Мы предполагаем, что это Bentley, выпущенный ограниченным тиражом, который искусственно сделан и выпускается в одном количестве.)
Весь процесс сборки автомобиля выглядит следующим образом:
Обработка параллельных операций в приложении аналогична приведенному выше сценарию.При возникновении этого сценария он может быть реализован с помощью инструмента параллелизма Java CyclicBarrier.
2. Покажи мне код
Структура класса кода выглядит следующим образом:
I. MakeCarBody.java
public class MakeCarBody implements Runnable {
private CyclicBarrier cyclicBarrier;
public MakeCarBody(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
public void run() {
exec();
}
/**
* 模拟模拟造车身
*/
private void exec() {
//造完后继续造下一个
while(true) {
try {
System.out.println("Start making car body...");
long millis = ((int) (1 + Math.random() * (5 - 1 + 1))) * 1000;
TimeUnit.MILLISECONDS.sleep(millis);
System.out.println("Making car body is finished.");
//等待其他部件造完
this.cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
II. MakeCarDoor.java
public class MakeCarDoor implements Runnable {
private CyclicBarrier cyclicBarrier;
public MakeCarDoor(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
public void run() {
exec();
}
/**
* 模拟造车门
*/
private void exec() {
//造完后继续造下一个
while(true) {
try {
System.out.println("Start making car door...");
long millis = ((int) (1 + Math.random() * (5 - 1 + 1))) * 1000;
TimeUnit.MILLISECONDS.sleep(millis);
System.out.println("Making car door is finished.");
//等待其他部件造完
this.cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
III. MakeTire.java
public class MakeTire implements Runnable {
private CyclicBarrier cyclicBarrier;
public MakeTire(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}
public void run() {
exec();
}
/**
* 模拟造轮胎
*/
private void exec() {
//造完后继续造下一个
while(true) {
try {
System.out.println("Start making tire...");
long millis = ((int) (1 + Math.random() * (5 - 1 + 1))) * 1000;
TimeUnit.MILLISECONDS.sleep(millis);
System.out.println("Making tire is finished.");
//等待其他部件造完
this.cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
IV. AssembleCar.java
public class AssembleCar implements Runnable {
public void run() {
try {
System.out.println("Start assemble car...");
//模拟组装汽车
long millis = ((int)(1+Math.random()*(5-1+1))) * 1000;
TimeUnit.MILLISECONDS.sleep(millis);
System.out.println("Making assemble care is finished.");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
V. CyclicBarrierTest.java
public class CyclicBarrierTest {
public static void main(String[] args) {
//有3个部件要造,造完后组装汽车
CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new AssembleCar());
Thread makeCarBody = new Thread(new MakeCarBody(cyclicBarrier));
Thread makeCarDoor = new Thread(new MakeCarDoor(cyclicBarrier));
Thread makeTire = new Thread(new MakeTire(cyclicBarrier));
makeCarBody.start();
makeCarDoor.start();
makeTire.start();
}
}
Выходной журнал:
Start making car door...
Start making tire...
Start making car body...
Making tire is finished.
Making car door is finished.
Making car body is finished.
Start assemble car...
Making assemble care is finished.
Start making car body...
Start making tire...
Start making car door...
Making car body is finished.
Making tire is finished.
Making car door is finished.
Start assemble car...
Making assemble care is finished.
Вы можете видеть, что CyclicBarrier используется следующим образом:
1. Конструктор CyclicBarrier имеет 2 параметра: первый параметр должен объявить, что есть несколько частей, которые нужно изготовить (есть несколько вещей, которые можно распараллелить), а второй параметр — это Runnable, который представляет последнюю вещь, которую нужно изготовить. сделано после параллелизации.одна вещь.
2. После сборки каждого компонента вызовите метод await() объекта CyclicBarrier, чтобы дождаться начала следующего раунда.
3. Когда будет собран последний компонент, будет автоматически вызван класс реализации Runnable, переданный в конструктор CyclicBarrier.
4. После того, как реализация класса реализации Runnable будет завершена, снова начните следующий раунд.
3. Резюме
Применимые сценарии CyclicBarrier:
1. После завершения нескольких дел можно приступить к другому делу.
2. Несколько вещей, которые необходимо сделать, можно делать независимо и обрабатывать параллельно.
3. После того, как все вышеперечисленное будет выполнено, перейдите к следующему раунду обработки.
end.