AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

掌握Guava的并發(fā)工具:輕松應(yīng)對(duì)復(fù)雜并發(fā)場(chǎng)景

來(lái)源: 責(zé)編: 時(shí)間:2024-02-01 12:48:58 244觀看
導(dǎo)讀關(guān)于Guava的并發(fā)工具Guava提供了一些豐富的并發(fā)工具,幫助開(kāi)發(fā)者更好地處理并發(fā)編程中的問(wèn)題。例如,Guava提供了ListenableFuture、CountDownLatch、CyclicBarrier等工具。這些工具對(duì)Java并發(fā)包(java.util.concurrent)進(jìn)行

關(guān)于Guava的并發(fā)工具

Guava提供了一些豐富的并發(fā)工具,幫助開(kāi)發(fā)者更好地處理并發(fā)編程中的問(wèn)題。例如,Guava提供了ListenableFuture、CountDownLatch、CyclicBarrier等工具。這些工具對(duì)Java并發(fā)包(java.util.concurrent)進(jìn)行了擴(kuò)展,使其功能更強(qiáng)大,使用更方便。1uI28資訊網(wǎng)——每日最新資訊28at.com

具體來(lái)說(shuō),其中ListenableFuture是Guava對(duì)Java Future的擴(kuò)展,它允許你注冊(cè)回調(diào)函數(shù),當(dāng)Future的計(jì)算結(jié)果可用時(shí),這個(gè)回調(diào)函數(shù)會(huì)被執(zhí)行。CountDownLatch和CyclicBarrier則是用于同步的工具類(lèi),它們可以讓一組線程等待彼此,然后再一起執(zhí)行。1uI28資訊網(wǎng)——每日最新資訊28at.com

Guava的并發(fā)工具盤(pán)點(diǎn)

Guava提供的并發(fā)工具當(dāng)然不僅僅只有ListenableFuture、CountDownLatch、CyclicBarrier等,還有很多其他的,博主這里算是拋磚引玉吧,把我用過(guò)的,我認(rèn)為比較好用的,在這里給大家梳理總結(jié)一下,如果大家用到了其他更好用的,歡迎在評(píng)論區(qū)告訴,一起深入交流。那么本篇文章的主角就是ListenableFuture、CountDownLatch和CyclicBarrier,那么下面先簡(jiǎn)單的盤(pán)一下這幾個(gè)類(lèi)的功能特性:1uI28資訊網(wǎng)——每日最新資訊28at.com

  • ListenableFuture:它是Guava對(duì)JDK的Future接口的擴(kuò)展。相比于傳統(tǒng)的Future,ListenableFuture允許你注冊(cè)一個(gè)回調(diào)函數(shù),一旦計(jì)算完成,這個(gè)回調(diào)函數(shù)就會(huì)被執(zhí)行。這使得ListenableFuture在處理異步計(jì)算的結(jié)果時(shí)提供了更大的靈活性。
  • CountDownLatch:這是Java中的一個(gè)并發(fā)工具類(lèi),用于協(xié)調(diào)多個(gè)線程之間的同步。CountDownLatch能夠使一個(gè)線程等待其他線程完成各自的工作后再執(zhí)行。例如,你可以使用CountDownLatch來(lái)確保在繼續(xù)執(zhí)行主線程之前,一組工作線程已經(jīng)完成了它們的初始化工作。
  • CyclicBarrier:這是Java中的一個(gè)同步工具類(lèi)。CyclicBarrier可以讓一組線程互相等待,直到所有線程都達(dá)到某個(gè)狀態(tài)后再一起執(zhí)行。這在并行計(jì)算中特別有用,例如,你可能想要在所有線程都完成了它們的一部分計(jì)算后,再進(jìn)行一次匯總操作。CyclicBarrier可以確保所有線程都在同一時(shí)間點(diǎn)進(jìn)行這個(gè)匯總操作。

環(huán)境配置

目前maven中央倉(cāng)庫(kù)的最新版本是32.1.3-jre,本篇文章的所有示例也是基于這個(gè)版本:1uI28資訊網(wǎng)——每日最新資訊28at.com

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

Guava的并發(fā)工具如何使用

ListenableFuture

Guava類(lèi)庫(kù)的ListenableFuture是一個(gè)強(qiáng)大的工具,它擴(kuò)展了Java的Future接口,增加了注冊(cè)回調(diào)函數(shù)的功能。下面是一個(gè)使用Guava的ListenableFuture的示例:1uI28資訊網(wǎng)——每日最新資訊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 {                // 模擬異步任務(wù)                Thread.sleep(2000);                System.out.println(Thread.currentThread().getName() + ":異步任務(wù)執(zhí)行完畢");                return "異步任務(wù)執(zhí)行成功:success";            }        });        Futures.addCallback(future, new FutureCallback<String>() {            @Override            public void onSuccess(String result) {                // 異步任務(wù)執(zhí)行成功后的回調(diào)方法                System.out.println(Thread.currentThread().getName() + ":異步任務(wù)執(zhí)行成功,結(jié)果是:" + result);                listeningExecutorService.shutdown();//收到回調(diào)結(jié)果后,建議關(guān)注線程池,否則監(jiān)聽(tīng)回調(diào)程序會(huì)一直阻塞,不會(huì)結(jié)束;            }            @Override            public void onFailure(Throwable t) {                // 異步任務(wù)執(zhí)行失敗后的回調(diào)方法                System.out.println("異步任務(wù)執(zhí)行失敗");                t.printStackTrace();            }        }, executorService);        System.out.println(Thread.currentThread().getName() + ":主線程繼續(xù)執(zhí)行其他任務(wù)...");    }}

在上面這個(gè)示例中,我們使用了Guava的ListeningExecutorService來(lái)創(chuàng)建一個(gè)線程池,并通過(guò)submit方法提交了一個(gè)異步任務(wù)。該異步任務(wù)模擬了一個(gè)耗時(shí)操作,等待2秒后返回結(jié)果。然后,我們使用Futures.addCallback方法為L(zhǎng)istenableFuture對(duì)象注冊(cè)了一個(gè)回調(diào)函數(shù)。當(dāng)異步任務(wù)執(zhí)行成功時(shí),會(huì)調(diào)用onSuccess方法,并打印出異步任務(wù)的結(jié)果;當(dāng)異步任務(wù)執(zhí)行失敗時(shí),會(huì)調(diào)用onFailure方法,并打印出異常信息。最后,主線程繼續(xù)執(zhí)行其他任務(wù)。需要注意的是:在這里我關(guān)閉了線程池,否則監(jiān)聽(tīng)回調(diào)程序會(huì)一直阻塞,不會(huì)結(jié)束;1uI28資訊網(wǎng)——每日最新資訊28at.com

CountDownLatch1uI28資訊網(wǎng)——每日最新資訊28at.com

在下面這個(gè)示例中,我們使用了Guava類(lèi)庫(kù)的Uninterruptibles.awaitUninterruptibly()方法來(lái)等待CountDownLatch的計(jì)數(shù)器變?yōu)?。這與使用Java標(biāo)準(zhǔn)庫(kù)中的latch.await()方法類(lèi)似,但Guava提供的方法能夠更優(yōu)雅地處理中斷。其余部分與之前的示例相同,創(chuàng)建了多個(gè)工作線程,并使用CountDownLatch來(lái)協(xié)調(diào)它們的執(zhí)行。當(dāng)所有工作線程都調(diào)用latch.countDown()方法后,計(jì)數(shù)器將變?yōu)?,然后主線程通過(guò)Uninterruptibles.awaitUninterruptibly(latch)等待所有工作線程執(zhí)行完畢,并輸出"All worker threads have finished."。1uI28資訊網(wǎng)——每日最新資訊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類(lèi)等待所有工作線程執(zhí)行完畢        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)); // 模擬工作線程執(zhí)行的任務(wù)            System.out.println(Thread.currentThread().getName() + " has finished.");        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            latch.countDown(); // 工作線程完成任務(wù)后,計(jì)數(shù)器減一        }    }}

CyclicBarrier

在 Guava 類(lèi)庫(kù)中,沒(méi)有直接提供 CyclicBarrier 類(lèi)。CyclicBarrier 是 Java 標(biāo)準(zhǔn)庫(kù)中的一個(gè)類(lèi),它可以用于多線程間的同步。這里也簡(jiǎn)單梳理一下他的用法,因?yàn)樵谧龆嗑€程間同步協(xié)調(diào)的相關(guān)業(yè)務(wù)時(shí),CountDownLatch和CyclicBarrier,是兩個(gè)繞不過(guò)去的選項(xiàng),這里放在一起也好作個(gè)對(duì)比。1uI28資訊網(wǎng)——每日最新資訊28at.com

在下面這個(gè)示例中,創(chuàng)建了10個(gè)工作線程,每個(gè)線程都執(zhí)行相同的任務(wù)。這些線程通過(guò)CyclicBarrier進(jìn)行同步,確保所有線程都達(dá)到屏障點(diǎn)(即調(diào)用cyclicBarrier.await()方法)后再一起繼續(xù)執(zhí)行。當(dāng)所有線程都調(diào)用cyclicBarrier.await()方法后,屏障會(huì)被打破,所有線程可以繼續(xù)執(zhí)行后續(xù)的任務(wù)。在這個(gè)示例中,后續(xù)的任務(wù)是輸出線程名稱(chēng)和"is running"的消息。1uI28資訊網(wǎng)——每日最新資訊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(); //等待其他線程到達(dá)屏障點(diǎn)        } catch (Exception e) {            e.printStackTrace();        }        System.out.println(Thread.currentThread().getName() + " is running");    }}

寫(xiě)在最后

希望這篇文章能夠?yàn)槟闾峁┯嘘P(guān) Guava 的 并發(fā)工具類(lèi)的使用方法,讓你在處理異步任務(wù)時(shí)能夠更加得心應(yīng)手1uI28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-70425-0.html掌握Guava的并發(fā)工具:輕松應(yīng)對(duì)復(fù)雜并發(fā)場(chǎng)景

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

下一篇: JS小知識(shí),分享七個(gè)高頻的工具函數(shù),也許你用的上

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 7月安卓手機(jī)性?xún)r(jià)比榜:努比亞+紅魔兩款新機(jī)入榜

    7月登場(chǎng)的新機(jī)有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產(chǎn)品,而且努比亞和紅魔也一貫有著不錯(cuò)的性?xún)r(jià)比,所以在本次的性?xún)r(jià)比榜單
  • 6月安卓手機(jī)性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經(jīng)正式過(guò)去了,我們也迎來(lái)了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發(fā)布之前,性能榜的榜單大體會(huì)以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領(lǐng)先
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過(guò)購(gòu)物網(wǎng)站,可能遇到過(guò)圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時(shí)候了!學(xué)弟,最近學(xué)習(xí)的怎么樣啊 了不起學(xué)弟:最近學(xué)習(xí)的還不錯(cuò),每天都在學(xué)習(xí),每天都在進(jìn)步! 了不起:那你最近學(xué)習(xí)的什么呢? 了不起學(xué)弟:最近在學(xué)習(xí)C
  • 猿輔導(dǎo)與新東方的兩種“歸途”

    作者|卓心月 出品|零態(tài)LT(ID:LingTai_LT)如何成為一家偉大企業(yè)?答案一定是對(duì)&ldquo;勢(shì)&rdquo;的把握,這其中最關(guān)鍵的當(dāng)屬對(duì)企業(yè)戰(zhàn)略的制定,且能夠站在未來(lái)看現(xiàn)在,即使這其中的
  • 新電商三兄弟,“抖快紅”成團(tuán)!

    來(lái)源:價(jià)值研究所作 者:Hernanderz 隨著內(nèi)容電商的概念興起,抖音、快手、小紅書(shū)組成的&ldquo;新電商三兄弟&rdquo;成為業(yè)內(nèi)一股不可忽視的勢(shì)力,給阿里、京東、拼多多帶去了巨大壓
  • 攜眾多高端產(chǎn)品亮相ChinaJoy,小米帶來(lái)一場(chǎng)科技與人文的視聽(tīng)盛宴

    7月28日,全球數(shù)字娛樂(lè)領(lǐng)域最具知名度與影響力的年度盛會(huì)中國(guó)國(guó)際數(shù)碼互動(dòng)娛樂(lè)展覽會(huì)(簡(jiǎn)稱(chēng)ChinaJoy)在上海新國(guó)際博覽中心盛大開(kāi)幕。作為全球領(lǐng)先的科
  • 造車(chē)兩年股價(jià)跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車(chē)后的首個(gè)交易日起持有小米集團(tuán)的股票,那么截至2023年上半年最后一個(gè)交易日,投資者將浮虧59.16%,同區(qū)間的恒生科技指數(shù)跌幅為52.78%
  • SN570 NVMe SSD固態(tài)硬盤(pán) 價(jià)格與性能兼具

    SN570 NVMe SSD固態(tài)硬盤(pán)是西部數(shù)據(jù)發(fā)布的最新一代WD Blue系列的固態(tài)硬盤(pán),不僅閃存技術(shù)更為精進(jìn),性能也得到了進(jìn)一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top