当前位置:首页 > 科技  > 软件

掌握Guava的并发工具:轻松应对复杂并发场景

来源: 责编: 时间:2024-02-01 12:48:58 296观看
导读关于Guava的并发工具Guava提供了一些丰富的并发工具,帮助开发者更好地处理并发编程中的问题。例如,Guava提供了ListenableFuture、CountDownLatch、CyclicBarrier等工具。这些工具对Java并发包(java.util.concurrent)进行

关于Guava的并发工具

Guava提供了一些丰富的并发工具,帮助开发者更好地处理并发编程中的问题。例如,Guava提供了ListenableFuture、CountDownLatch、CyclicBarrier等工具。这些工具对Java并发包(java.util.concurrent)进行了扩展,使其功能更强大,使用更方便。Uln28资讯网——每日最新资讯28at.com

具体来说,其中ListenableFuture是Guava对Java Future的扩展,它允许你注册回调函数,当Future的计算结果可用时,这个回调函数会被执行。CountDownLatch和CyclicBarrier则是用于同步的工具类,它们可以让一组线程等待彼此,然后再一起执行。Uln28资讯网——每日最新资讯28at.com

Guava的并发工具盘点

Guava提供的并发工具当然不仅仅只有ListenableFuture、CountDownLatch、CyclicBarrier等,还有很多其他的,博主这里算是抛砖引玉吧,把我用过的,我认为比较好用的,在这里给大家梳理总结一下,如果大家用到了其他更好用的,欢迎在评论区告诉,一起深入交流。那么本篇文章的主角就是ListenableFuture、CountDownLatch和CyclicBarrier,那么下面先简单的盘一下这几个类的功能特性:Uln28资讯网——每日最新资讯28at.com

  • ListenableFuture:它是Guava对JDK的Future接口的扩展。相比于传统的Future,ListenableFuture允许你注册一个回调函数,一旦计算完成,这个回调函数就会被执行。这使得ListenableFuture在处理异步计算的结果时提供了更大的灵活性。
  • CountDownLatch:这是Java中的一个并发工具类,用于协调多个线程之间的同步。CountDownLatch能够使一个线程等待其他线程完成各自的工作后再执行。例如,你可以使用CountDownLatch来确保在继续执行主线程之前,一组工作线程已经完成了它们的初始化工作。
  • CyclicBarrier:这是Java中的一个同步工具类。CyclicBarrier可以让一组线程互相等待,直到所有线程都达到某个状态后再一起执行。这在并行计算中特别有用,例如,你可能想要在所有线程都完成了它们的一部分计算后,再进行一次汇总操作。CyclicBarrier可以确保所有线程都在同一时间点进行这个汇总操作。

环境配置

目前maven中央仓库的最新版本是32.1.3-jre,本篇文章的所有示例也是基于这个版本:Uln28资讯网——每日最新资讯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的示例:Uln28资讯网——每日最新资讯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方法,并打印出异常信息。最后,主线程继续执行其他任务。需要注意的是:在这里我关闭了线程池,否则监听回调程序会一直阻塞,不会结束;Uln28资讯网——每日最新资讯28at.com

CountDownLatchUln28资讯网——每日最新资讯28at.com

在下面这个示例中,我们使用了Guava类库的Uninterruptibles.awaitUninterruptibly()方法来等待CountDownLatch的计数器变为0。这与使用Java标准库中的latch.await()方法类似,但Guava提供的方法能够更优雅地处理中断。其余部分与之前的示例相同,创建了多个工作线程,并使用CountDownLatch来协调它们的执行。当所有工作线程都调用latch.countDown()方法后,计数器将变为0,然后主线程通过Uninterruptibles.awaitUninterruptibly(latch)等待所有工作线程执行完毕,并输出"All worker threads have finished."。Uln28资讯网——每日最新资讯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,是两个绕不过去的选项,这里放在一起也好作个对比。Uln28资讯网——每日最新资讯28at.com

在下面这个示例中,创建了10个工作线程,每个线程都执行相同的任务。这些线程通过CyclicBarrier进行同步,确保所有线程都达到屏障点(即调用cyclicBarrier.await()方法)后再一起继续执行。当所有线程都调用cyclicBarrier.await()方法后,屏障会被打破,所有线程可以继续执行后续的任务。在这个示例中,后续的任务是输出线程名称和"is running"的消息。Uln28资讯网——每日最新资讯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 的 并发工具类的使用方法,让你在处理异步任务时能够更加得心应手Uln28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-70425-0.html掌握Guava的并发工具:轻松应对复杂并发场景

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

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

下一篇: JS小知识,分享七个高频的工具函数,也许你用的上

标签:
  • 热门焦点
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
Top