成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 開發工具
Guava類庫的ListenableFuture是一個強大的工具,它擴展了Java的Future接口,增加了注冊回調函數的功能。

關于Guava的并發工具

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

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

Guava的并發工具盤點

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

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

環境配置

目前maven中央倉庫的最新版本是32.1.3-jre,本篇文章的所有示例也是基于這個版本:

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

Guava的并發工具如何使用

ListenableFuture

Guava類庫的ListenableFuture是一個強大的工具,它擴展了Java的Future接口,增加了注冊回調函數的功能。下面是一個使用Guava的ListenableFuture的示例:

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方法,并打印出異常信息。最后,主線程繼續執行其他任務。需要注意的是:在這里我關閉了線程池,否則監聽回調程序會一直阻塞,不會結束;

CountDownLatch

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

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,是兩個繞不過去的選項,這里放在一起也好作個對比。

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

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 的 并發工具類的使用方法,讓你在處理異步任務時能夠更加得心應手

責任編輯:武曉燕 來源: 凡夫貶夫
相關推薦

2022-05-11 11:25:49

模型方案

2023-10-23 09:44:00

并發管理線程

2024-03-28 08:41:10

高并發.NET異步編程

2021-05-14 14:52:59

高并發TPSQPS

2024-01-05 08:23:55

HttpClientQPS高并發

2014-12-25 09:47:59

GuavaGuava并發

2023-10-20 08:01:08

2024-08-26 09:51:57

2025-01-15 08:42:41

2023-11-03 08:32:53

Flask高并發

2020-01-07 10:55:37

并發Nginx運維

2024-11-04 09:22:54

2025-02-28 00:03:22

高并發TPS系統

2025-02-26 03:00:00

2016-05-30 10:06:12

用友iUAP壓力測試

2024-01-03 10:03:26

PythonTCP服務器

2024-07-03 11:01:55

2023-11-20 22:44:09

Golang并發

2020-04-22 10:43:49

高并發數據阿里巴巴

2022-05-27 09:25:49

數據并發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区中文字幕 | 成人av在线播放 | 夜夜爽99久久国产综合精品女不卡 | 亚洲精品一二三 | 男女视频在线免费观看 | 青青草亚洲 | 色吊丝2288sds中文字幕 | 亚洲精品久久久一区二区三区 | 亚洲精品第一国产综合野 | 草草在线观看 | 日韩在线观看网站 | 亚洲欧美精品在线 | 国产精品久久国产精品 | 九九在线精品视频 | 天天干天天爽 | 国产精品视频久久久 | 久久精品国内 | 一区二区三区免费 | 99精品久久 | 日韩中文在线观看 | 亚洲一区二区三区在线播放 | 成人av在线大片 | 九九精品热| 欧州一区二区三区 | 亚洲欧美网站 | 国产999精品久久久 日本视频一区二区三区 | 草草网| 亚洲国产高清高潮精品美女 | 色综合久久88色综合天天 | 久久亚洲一区 | 亚洲视频免费在线观看 | 久久久久亚洲精品国产 | 日韩毛片在线免费观看 | 欧美一区二区三区视频 | 日本在线视频一区二区 | 天堂一区 | 国产精品自拍视频 | 精品视频久久久 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | av资源网站 | 一区二区三区在线看 |