日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

掌握Guava的并發工具:輕松應對復雜并發場景

來源: 責編: 時間:2024-02-01 12:48:58 219觀看
導讀關于Guava的并發工具Guava提供了一些豐富的并發工具,幫助開發者更好地處理并發編程中的問題。例如,Guava提供了ListenableFuture、CountDownLatch、CyclicBarrier等工具。這些工具對Java并發包(java.util.concurrent)進行

關于Guava的并發工具

Guava提供了一些豐富的并發工具,幫助開發者更好地處理并發編程中的問題。例如,Guava提供了ListenableFuture、CountDownLatch、CyclicBarrier等工具。這些工具對Java并發包(java.util.concurrent)進行了擴展,使其功能更強大,使用更方便。2nL28資訊網——每日最新資訊28at.com

具體來說,其中ListenableFuture是Guava對Java Future的擴展,它允許你注冊回調函數,當Future的計算結果可用時,這個回調函數會被執行。CountDownLatch和CyclicBarrier則是用于同步的工具類,它們可以讓一組線程等待彼此,然后再一起執行。2nL28資訊網——每日最新資訊28at.com

Guava的并發工具盤點

Guava提供的并發工具當然不僅僅只有ListenableFuture、CountDownLatch、CyclicBarrier等,還有很多其他的,博主這里算是拋磚引玉吧,把我用過的,我認為比較好用的,在這里給大家梳理總結一下,如果大家用到了其他更好用的,歡迎在評論區告訴,一起深入交流。那么本篇文章的主角就是ListenableFuture、CountDownLatch和CyclicBarrier,那么下面先簡單的盤一下這幾個類的功能特性:2nL28資訊網——每日最新資訊28at.com

  • ListenableFuture:它是Guava對JDK的Future接口的擴展。相比于傳統的Future,ListenableFuture允許你注冊一個回調函數,一旦計算完成,這個回調函數就會被執行。這使得ListenableFuture在處理異步計算的結果時提供了更大的靈活性。
  • CountDownLatch:這是Java中的一個并發工具類,用于協調多個線程之間的同步。CountDownLatch能夠使一個線程等待其他線程完成各自的工作后再執行。例如,你可以使用CountDownLatch來確保在繼續執行主線程之前,一組工作線程已經完成了它們的初始化工作。
  • CyclicBarrier:這是Java中的一個同步工具類。CyclicBarrier可以讓一組線程互相等待,直到所有線程都達到某個狀態后再一起執行。這在并行計算中特別有用,例如,你可能想要在所有線程都完成了它們的一部分計算后,再進行一次匯總操作。CyclicBarrier可以確保所有線程都在同一時間點進行這個匯總操作。

環境配置

目前maven中央倉庫的最新版本是32.1.3-jre,本篇文章的所有示例也是基于這個版本:2nL28資訊網——每日最新資訊28at.com

<dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>32.1.3-jre</version></dependency>

Guava的并發工具如何使用

ListenableFuture

Guava類庫的ListenableFuture是一個強大的工具,它擴展了Java的Future接口,增加了注冊回調函數的功能。下面是一個使用Guava的ListenableFuture的示例:2nL28資訊網——每日最新資訊28at.com

public class ListenableFutureExample {    public static void main(String[] args) {        ExecutorService executorService = Executors.newSingleThreadExecutor();        ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);        ListenableFuture<String> future = listeningExecutorService.submit(new Callable<String>() {            @Override            public String call() throws Exception {                // 模擬異步任務                Thread.sleep(2000);                System.out.println(Thread.currentThread().getName() + ":異步任務執行完畢");                return "異步任務執行成功:success";            }        });        Futures.addCallback(future, new FutureCallback<String>() {            @Override            public void onSuccess(String result) {                // 異步任務執行成功后的回調方法                System.out.println(Thread.currentThread().getName() + ":異步任務執行成功,結果是:" + result);                listeningExecutorService.shutdown();//收到回調結果后,建議關注線程池,否則監聽回調程序會一直阻塞,不會結束;            }            @Override            public void onFailure(Throwable t) {                // 異步任務執行失敗后的回調方法                System.out.println("異步任務執行失敗");                t.printStackTrace();            }        }, executorService);        System.out.println(Thread.currentThread().getName() + ":主線程繼續執行其他任務...");    }}

在上面這個示例中,我們使用了Guava的ListeningExecutorService來創建一個線程池,并通過submit方法提交了一個異步任務。該異步任務模擬了一個耗時操作,等待2秒后返回結果。然后,我們使用Futures.addCallback方法為ListenableFuture對象注冊了一個回調函數。當異步任務執行成功時,會調用onSuccess方法,并打印出異步任務的結果;當異步任務執行失敗時,會調用onFailure方法,并打印出異常信息。最后,主線程繼續執行其他任務。需要注意的是:在這里我關閉了線程池,否則監聽回調程序會一直阻塞,不會結束;2nL28資訊網——每日最新資訊28at.com

CountDownLatch2nL28資訊網——每日最新資訊28at.com

在下面這個示例中,我們使用了Guava類庫的Uninterruptibles.awaitUninterruptibly()方法來等待CountDownLatch的計數器變為0。這與使用Java標準庫中的latch.await()方法類似,但Guava提供的方法能夠更優雅地處理中斷。其余部分與之前的示例相同,創建了多個工作線程,并使用CountDownLatch來協調它們的執行。當所有工作線程都調用latch.countDown()方法后,計數器將變為0,然后主線程通過Uninterruptibles.awaitUninterruptibly(latch)等待所有工作線程執行完畢,并輸出"All worker threads have finished."。2nL28資訊網——每日最新資訊28at.com

public class GuavaCountDownLatchExample {    public static void main(String[] args) {        int numberOfThreads = 3;        CountDownLatch latch = new CountDownLatch(numberOfThreads);        for (int i = 0; i < numberOfThreads; i++) {            new Thread(new Worker(latch), "Thread" + i).start();        }        Uninterruptibles.awaitUninterruptibly(latch); // 使用Guava的Uninterruptibles類等待所有工作線程執行完畢        System.out.println("All worker threads have finished.");    }}class Worker implements Runnable {    private final CountDownLatch latch;    Worker(CountDownLatch latch) {        this.latch = latch;    }    @Override    public void run() {        try {            System.out.println(Thread.currentThread().getName() + " is working.");            Thread.sleep((long) (Math.random() * 1000)); // 模擬工作線程執行的任務            System.out.println(Thread.currentThread().getName() + " has finished.");        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            latch.countDown(); // 工作線程完成任務后,計數器減一        }    }}

CyclicBarrier

在 Guava 類庫中,沒有直接提供 CyclicBarrier 類。CyclicBarrier 是 Java 標準庫中的一個類,它可以用于多線程間的同步。這里也簡單梳理一下他的用法,因為在做多線程間同步協調的相關業務時,CountDownLatch和CyclicBarrier,是兩個繞不過去的選項,這里放在一起也好作個對比。2nL28資訊網——每日最新資訊28at.com

在下面這個示例中,創建了10個工作線程,每個線程都執行相同的任務。這些線程通過CyclicBarrier進行同步,確保所有線程都達到屏障點(即調用cyclicBarrier.await()方法)后再一起繼續執行。當所有線程都調用cyclicBarrier.await()方法后,屏障會被打破,所有線程可以繼續執行后續的任務。在這個示例中,后續的任務是輸出線程名稱和"is running"的消息。2nL28資訊網——每日最新資訊28at.com

public class CyclicBarrierExample {    public static void main(String[] args) {        final int totalThread = 10;        CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread);        for (int i = 0; i < totalThread; i++) {            new Thread(new Task(cyclicBarrier), "Thread" + i).start();        }    }}class Task implements Runnable {    private CyclicBarrier cyclicBarrier;    public Task(CyclicBarrier cyclicBarrier) {        this.cyclicBarrier = cyclicBarrier;    }    @Override    public void run() {        System.out.println(Thread.currentThread().getName() + " is ready");        try {            cyclicBarrier.await(); //等待其他線程到達屏障點        } catch (Exception e) {            e.printStackTrace();        }        System.out.println(Thread.currentThread().getName() + " is running");    }}

寫在最后

希望這篇文章能夠為你提供有關 Guava 的 并發工具類的使用方法,讓你在處理異步任務時能夠更加得心應手2nL28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-70425-0.html掌握Guava的并發工具:輕松應對復雜并發場景

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java中如何使用NullPointerException?

下一篇: JS小知識,分享七個高頻的工具函數,也許你用的上

標簽:
  • 熱門焦點
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數據的地方,是數據源的一種,比如大家經常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數據,它既可以保
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 國行版三星Galaxy Z Fold5/Z Flip5發布 售價7499元起

    2023年8月3日,三星電子舉行Galaxy新品中國發布會,正式在國內推出了新一代折疊屏智能手機三星Galaxy Z Fold5與Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 三翼鳥智能家居亮相電博會,讓用戶體驗更真實

    2021電博會在青島國際會展中心開幕中,三翼鳥直接把“家”搬到了現場,成為了展會的一大看點。這也是三翼鳥繼9月9日發布了行業首個一站式定制智慧家平臺后的
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 清远市| 石渠县| 淮安市| 台东市| 历史| 邢台市| 临安市| 泗水县| 浙江省| 上思县| 扎赉特旗| 遵义市| 孝义市| 金阳县| 宁陕县| 浦江县| 田东县| 鹤壁市| 长寿区| 澎湖县| 太保市| 大兴区| 安溪县| 曲阜市| 丽江市| 德格县| 聊城市| 平邑县| 泸定县| 永春县| 于都县| 明水县| 宁晋县| 泌阳县| 山丹县| 宁国市| 都安| 铜鼓县| 青川县| 长海县| 海南省|