Java 多線程等待優(yōu)雅的實(shí)現(xiàn)方式之Phaser同步屏障
前言
是否會(huì)遇到這樣的場景,你向線程池提交了多個(gè)任務(wù),你希望這批任務(wù)全部完成后能夠反向通知你。
你可能會(huì)使用線程計(jì)數(shù)的方式,等到計(jì)數(shù)器累加到提交的線程數(shù)量,然后通知。emmm,不是不可以,只是不夠優(yōu)雅。本文提供優(yōu)雅的實(shí)現(xiàn)方式,Phaser同步屏障。
Maven依賴
也可以不依賴,本人習(xí)慣把代碼簡單化,使用了hutool,所以依賴只有這個(gè)。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.15</version>
</dependency>
代碼
廢話不多說,上代碼。
package com.huyi.csdn.tools;
import cn.hutool.core.thread.ThreadUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Phaser;
import java.util.concurrent.TimeUnit;
/**
* @Program: csdn @ClassName: PhaserUtil @Author: huyi @Date: 2021-11-06 21:03 @Description:
* 多線程監(jiān)控回調(diào)工具 @Version: V1.0
*/
public class PhaserUtil {
public static final ExecutorService executorService = Executors.newFixedThreadPool(50);
public static class CustomPharser extends Phaser {
private final Runnable runnable;
public CustomPharser(Runnable runnable) {
this.runnable = runnable;
}
@Override
protected boolean onAdvance(int phase, int registeredParties) {
this.runnable.run();
return super.onAdvance(phase, registeredParties);
}
}
/**
* 提交任務(wù)以及完成后需要執(zhí)行的內(nèi)容
*
* @param tasks 任務(wù)
* @param complete 完成任務(wù)
*/
public static void submit(List<Runnable> tasks, Runnable complete) {
Phaser phaser = new CustomPharser(complete);
for (Runnable runnable : tasks) {
executorService.submit(
() -> {
phaser.register();
runnable.run();
System.out.println(Thread.currentThread().getName() + "完成任務(wù)!");
phaser.arriveAndAwaitAdvance();
});
}
}
/** 摧毀線程池 */
public static void destroy() {
System.out.println("摧毀線程池");
executorService.shutdown();
}
public static void main(String[] args) {
List<Runnable> tasks = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
tasks.add(
() -> {
ThreadUtil.sleep(random.nextInt(10), TimeUnit.SECONDS);
});
}
submit(tasks, () -> System.out.println("所有任務(wù)已完成"));
ThreadUtil.sleep(20, TimeUnit.SECONDS);
destroy();
}
}
代碼說明
1、提交任務(wù)執(zhí)行的方式是Runnable也好,Callable也好,或者Consumer、Function等等,不影響,你可以看著調(diào)整。
2、完成后的Runnable也和第一點(diǎn)同理。
驗(yàn)證一下

OK,沒什么問題。
總結(jié)
其實(shí)我一直想分享一些可以讓讀者工作中能用到的東西,想到牧神記里面的一句話,圣人之道,無非就是百姓日用。emmmm,又廢話了。
分享一下:
沒必要的事就不做,必要的事就盡快做。---冰果
如果本文對你有用,請不要吝嗇你的贊,謝謝。

以上就是Java 多線程等待優(yōu)雅的實(shí)現(xiàn)方式之Phaser同步屏障的詳細(xì)內(nèi)容,更多關(guān)于Java 多線程等待的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于BeanUtils.copyProperties(source, target)的使用
這篇文章主要介紹了關(guān)于BeanUtils.copyProperties(source, target)的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
JetBrains?發(fā)布下一代?IDE無比輕量幾秒就能啟動(dòng)干活
雖然?JetBrains?公司說?Fleet?的定位和目標(biāo)并不是代替其他?IDE,但個(gè)人覺得,?如果?Fleet?火起來了,其他?IDE?就會(huì)黯然失色,特別是多語言開發(fā)者,誰愿意裝多個(gè)?IDE?呢?到時(shí)候,可能?JetBrains?以后的所有?IDE?要一統(tǒng)江湖了2021-12-12
Java中使用HashMap時(shí)指定初始化容量性能解析
這篇文章主要為大家介紹了Java中使用HashMap時(shí)指定初始化容量性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

