最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 多線程等待優(yōu)雅的實(shí)現(xiàn)方式之Phaser同步屏障

 更新時(shí)間:2021年11月10日 10:59:41   作者:劍客阿良_ALiang  
在JAVA 1.7引入了一個(gè)新的并發(fā)API:Phaser,一個(gè)可重用的同步barrier。在此前,JAVA已經(jīng)有CyclicBarrier、CountDownLatch這兩種同步barrier,但是Phaser更加靈活,而且側(cè)重于 重用

前言

是否會(huì)遇到這樣的場(chǎng)景,你向線程池提交了多個(gè)任務(wù),你希望這批任務(wù)全部完成后能夠反向通知你。

你可能會(huì)使用線程計(jì)數(shù)的方式,等到計(jì)數(shù)器累加到提交的線程數(shù)量,然后通知。emmm,不是不可以,只是不夠優(yōu)雅。本文提供優(yōu)雅的實(shí)現(xiàn)方式,Phaser同步屏障。

Maven依賴

也可以不依賴,本人習(xí)慣把代碼簡(jiǎn)單化,使用了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,又廢話了。

分享一下:

沒必要的事就不做,必要的事就盡快做。---冰果

如果本文對(duì)你有用,請(qǐng)不要吝嗇你的贊,謝謝。

以上就是Java 多線程等待優(yōu)雅的實(shí)現(xiàn)方式之Phaser同步屏障的詳細(xì)內(nèi)容,更多關(guān)于Java 多線程等待的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于BeanUtils.copyProperties(source, target)的使用

    關(guān)于BeanUtils.copyProperties(source, target)的使用

    這篇文章主要介紹了關(guān)于BeanUtils.copyProperties(source, target)的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot中使用Ehcache的詳細(xì)教程

    SpringBoot中使用Ehcache的詳細(xì)教程

    EhCache 是一個(gè)純 Java 的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是 Hibernate 中默認(rèn)的 CacheProvider。這篇文章主要介紹了SpringBoot中使用Ehcache的相關(guān)知識(shí),需要的朋友可以參考下
    2020-08-08
  • 詳解Java Ajax jsonp 跨域請(qǐng)求

    詳解Java Ajax jsonp 跨域請(qǐng)求

    本篇文章主要介紹了詳解Java Ajax jsonp 跨域請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • JetBrains?發(fā)布下一代?IDE無比輕量幾秒就能啟動(dòng)干活

    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
  • AntDesign封裝全局異常處理全局?jǐn)r截器

    AntDesign封裝全局異常處理全局?jǐn)r截器

    這篇文章主要為大家介紹了AntDesign封裝全局異常處理全局?jǐn)r截器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java單例模式的創(chuàng)建,破壞和防破壞詳解

    Java單例模式的創(chuàng)建,破壞和防破壞詳解

    大家所熟知的單例模式只能創(chuàng)建唯一一個(gè)實(shí)例,今天我們介紹幾種常見的單例模式,同時(shí)說一說如何破壞單例模式,同時(shí)又怎么來防破壞
    2021-09-09
  • Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

    Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • JAVA中String介紹及常見面試題小結(jié)

    JAVA中String介紹及常見面試題小結(jié)

    這篇文章主要介紹了JAVA中String介紹及常見面試題,在java面試中經(jīng)常會(huì)被面試官問到,小編通過實(shí)例代碼相結(jié)合給大家詳細(xì)介紹,需要的朋友可以參考下
    2020-02-02
  • Java中使用HashMap時(shí)指定初始化容量性能解析

    Java中使用HashMap時(shí)指定初始化容量性能解析

    這篇文章主要為大家介紹了Java中使用HashMap時(shí)指定初始化容量性能解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • SpringBoot超詳細(xì)講解@Value注解

    SpringBoot超詳細(xì)講解@Value注解

    在使用spring框架的項(xiàng)目中,@Value是經(jīng)常使用的注解之一。作用是將配置文件中的鍵對(duì)應(yīng)的值分配給某類內(nèi)帶注解的屬性。本文使您系統(tǒng)地了解@Value的用法。在使用Spring框架的項(xiàng)目中@Value是經(jīng)常使用的注解之一,其作用是將配置文件中的鍵對(duì)應(yīng)的值分配給某類內(nèi)帶注解的屬性
    2022-07-07

最新評(píng)論

黄冈市| 绥滨县| 务川| 乌审旗| 新干县| 当涂县| 广水市| 平泉县| 内江市| 海城市| 阿拉尔市| 凤冈县| 昌乐县| 嘉定区| 郯城县| 邵武市| 荆门市| 兴海县| 项城市| 西和县| 盐山县| 建始县| 竹北市| 湄潭县| 玉溪市| 潢川县| 任丘市| 宝兴县| 乌鲁木齐县| 呼和浩特市| 新巴尔虎左旗| 台中市| 灵璧县| 武安市| 房山区| 兴义市| 安西县| 武陟县| 凤冈县| 轮台县| 仁寿县|