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

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

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

前言

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

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

Maven依賴

也可以不依賴,本人習慣把代碼簡單化,使用了hutool,所以依賴只有這個。

        <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也和第一點同理。

驗證一下

OK,沒什么問題。

總結(jié)

其實我一直想分享一些可以讓讀者工作中能用到的東西,想到牧神記里面的一句話,圣人之道,無非就是百姓日用。emmmm,又廢話了。

分享一下:

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

如果本文對你有用,請不要吝嗇你的贊,謝謝。

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

相關(guān)文章

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

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

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

    SpringBoot中使用Ehcache的詳細教程

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

    詳解Java Ajax jsonp 跨域請求

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

    JetBrains?發(fā)布下一代?IDE無比輕量幾秒就能啟動干活

    雖然?JetBrains?公司說?Fleet?的定位和目標并不是代替其他?IDE,但個人覺得,?如果?Fleet?火起來了,其他?IDE?就會黯然失色,特別是多語言開發(fā)者,誰愿意裝多個?IDE?呢?到時候,可能?JetBrains?以后的所有?IDE?要一統(tǒng)江湖了
    2021-12-12
  • AntDesign封裝全局異常處理全局攔截器

    AntDesign封裝全局異常處理全局攔截器

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

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

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

    Java實現(xiàn)簡單碰撞檢測

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

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

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

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

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

    SpringBoot超詳細講解@Value注解

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

最新評論

河南省| 洛浦县| 建瓯市| 平邑县| 车致| 兖州市| 郁南县| 法库县| 炎陵县| 武强县| 丰宁| 泽普县| 辰溪县| 偃师市| 定兴县| 汕头市| 玉溪市| 阜阳市| 嘉荫县| 会理县| 周口市| 宽甸| 兴义市| 赞皇县| 防城港市| 集贤县| 西林县| 太仓市| 兴山县| 梓潼县| 苗栗市| 前郭尔| 鄂托克前旗| 桃江县| 蓬安县| 张家界市| 时尚| 吴忠市| 鹤山市| 公主岭市| 开鲁县|