Связанное чтение:
Параллельное программирование на 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 (15) Сценарий приложения CyclicBarrier
Введение в параллельное программирование на Java (16) Понимание различий в пулах потоков за считанные секунды
Введение в параллельное программирование на Java (17) Изображение для освоения общих классов и интерфейсов потоков
Введение в параллельное программирование на Java (18) Повторное обсуждение безопасности потоков
Введение в параллельное программирование на Java (19) Инструмент планирования асинхронных задач CompleteFeature
Введение в параллельное программирование на Java (20) Общие сценарии блокировки и инструменты блокировки
1. Сценарии применения
Таких сценариев в реальной жизни много: прежде чем делать F, нужно дождаться завершения A, B, C, D, E, A, B, C, D, E можно выполнять одновременно, в произвольном порядке, для пример: есть дома по выходным, Есть 3 дела, папа готовит, мама готовит, а сын убирает со стола и накрывает посуду. Можно видеть, что характеристики этой сцены таковы:
1. Есть N дел, которые нужно сделать до еды. Вы можете есть после того, как все сделано. Количество дел, которые нужно сделать, равно N, и каждый раз, когда вы заканчиваете одно дело, оно уменьшается на 1. Когда дело нужно сделать, быть сделано 0, пора есть.
2. Каждая вещь может обрабатываться параллельно, нет последовательности, что повышает эффективность.
Вокруг еды весь процесс выглядит следующим образом:
При работе с параллельными операциями в приложении это похоже на описанный выше сценарий.Когда встречается этот сценарий, его можно реализовать с помощью инструмента параллелизма Java CountDownLatch.2. Покажи мне код
Структура класса кода выглядит следующим образом:
I. EatingActivity.java
class EatingActivity implements Runnable {
private CountDownLatch countDownLatch;
public EatingActivity(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void run() {
try {
//等待吃饭
System.out.println("Waiting for dinner...");
this.countDownLatch.await();
//所有事情做完后,await被唤醒,开始吃饭
System.out.println("Start eating...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
II. MakeRice.java
/**
* 做饭
*/
class MakeRice implements Runnable {
private CountDownLatch countDownLatch;
public MakeRice(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void run() {
exec();
}
/**
* 模拟做饭
*/
private void exec() {
try {
System.out.println("Start making rice...");
long millis = ((int)(1+Math.random()*(5-1+1))) * 1000;
Thread.sleep(millis);
System.out.println("Making rice is finished.");
//待处理事情减1
this.countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
III. MakeDish.java
/**
* 做菜
*/
class MakeDish implements Runnable {
private CountDownLatch countDownLatch;
public MakeDish(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void run() {
exec();
}
/**
* 模拟做菜
*/
private void exec() {
try {
System.out.println("Start making dish...");
long millis = ((int)(1+Math.random()*(5-1+1))) * 1000;
Thread.sleep(millis);
System.out.println("Making dish is finished.");
//待处理事情减1
this.countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
IV. CleanUpTable.java
/**
* 收拾桌子
*/
class CleanUpTable implements Runnable {
private CountDownLatch countDownLatch;
public CleanUpTable(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
public void run() {
exec();
}
/**
* 模拟收拾桌子
*/
private void exec() {
try {
System.out.println("Start making rice...");
long millis = ((int)(1+Math.random()*(5-1+1))) * 1000;
Thread.sleep(millis);
System.out.println("Cleaning up table is finished.");
//待处理事情减1
this.countDownLatch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
V. CountDownLatchTest.java
/**
* @ClassName CountDownLatchTest
* @Description 验证CountDownLatch
* @Author 铿然一叶
* @Date 2019/10/7 22:32
* @Version 1.0
* javashizhan.com
**/
public class CountDownLatchTest {
public static void main(String[] args) {
//为了吃饭,有3件事情要做
CountDownLatch countDownLatch = new CountDownLatch(3);
//吃饭活动
Thread eatingActivity = new Thread(new EatingActivity(countDownLatch));
eatingActivity.start();
//做饭
Thread makeRice = new Thread(new MakeRice(countDownLatch));
//做菜
Thread makeDish = new Thread(new MakeDish(countDownLatch));
//收拾桌子
Thread cleanUpTable = new Thread(new CleanUpTable(countDownLatch));
//并行开始做事情
makeRice.start();
makeDish.start();
cleanUpTable.start();
}
}
Выходной журнал:
Waiting for dinner...
Start making rice...
Start making rice...
Start making dish...
Cleaning up table is finished.
Making rice is finished.
Making dish is finished.
Start eating...
3. Другие сцены - группировка
В сцене группировки группа может быть сформирована после того, как число людей будет заполнено.Используется счетчик.Похоже,что для этого можно использовать CountDownLatch.На самом деле это не обязательно,потому что группировка не нужна. параллельно, пока есть счетчик, это можно реализовать.
4. Резюме
Применимые сценарии CountDownLatch:
1. После завершения нескольких дел можно приступить к другому делу.
2. Несколько вещей, которые необходимо сделать, можно делать независимо и обрабатывать параллельно.
end.