尝试一下Guava带返回值的多线程处理类ListenableFuture

这篇具有很好参考价值的文章主要介绍了尝试一下Guava带返回值的多线程处理类ListenableFuture。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在学习,Java实现异步编程的8种方式这篇博客的时候,没有找到比较好的一个学习demo,故在此整理一下。

ListenableFuture,带返回值的Guava多线程处理工具类

ListenableFuture是Java中的一个接口,它继承自java.util.concurrent.Future接口。ListenableFuture主要用于异步计算场景,允许在计算完成后添加回调函数(Callback),从而实现对异步任务执行结果的监听和处理。

与普通的Future不同,ListenableFuture提供了一种更加灵活且易于使用的方式来处理并发操作。当你提交一个任务到ExecutorService时,会返回一个ListenableFuture对象。这个对象表示将来某个时间点上可用的结果,并允许你在该结果可用时触发回调函数。

为了实现这一功能,ListenableFuture提供了两个关键方法:

  1. addListener(Runnable listener, Executor executor):此方法允许用户向ListenableFuture注册一个Runnable类型的监听器,在异步任务完成时由指定的executor执行。
  2. addCallback(FutureCallback<? super V> callback, Executor executor):此方法允许用户向ListenableFuture注册一个带有成功和失败处理逻辑的回调函数,在异步任务完成或出错时由指定的executor执行。

Google Guava库提供了对ListenableFutures进行操作、转换和组合等高级功能支持。例如:

  • Futures.transform():基于原始 ListenableFuture 的值创建新 ListenableFutures。
  • Futures.allAsList() 和 Futures.successfulAsList():将多个 ListenableFutures 组合成单个 Future。
  • Futures.immediate* 系列方法:创建已经具备特定值或异常状态下立即完成的 ListenableFutures。

总之,ListenableFuture提供了一种更加灵活、高效且易于使用的方式来处理并发操作和异步任务。它允许开发者在计算完成后添加回调函数,从而实现对异步任务执行结果的监听和处理。

举个例子

下面是一个使用ListenableFuture的示例,其中在for循环中提交了多个任务:

import com.google.common.util.concurrent.*;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;

public class ListenableFutureDemo {

    public static void main(String[] args) {
        // 创建一个线程池
        ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));

        // 用于存储所有的ListenableFuture对象
        List<ListenableFuture<String>> futures = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            final int taskId = i;

            Callable<String> task = () -> {
                Thread.sleep(1000); // 模拟耗时操作
                return "Task " + taskId + " completed";
            };

            ListenableFuture<String> future = executorService.submit(task);
            Futures.addCallback(future, new FutureCallback<>() {
                @Override
                public void onSuccess(String result) {
                    System.out.println("Success: " + result);
                }

                @Override
                public void onFailure(Throwable t) {
                    System.err.println("Error occurred while executing task " + taskId);
                    t.printStackTrace();
                }
            }, MoreExecutors.directExecutor());

            futures.add(future);
        }

        try {
          // 等待所有任务完成,并获取结果。
          List<String> results = Futures.allAsList(futures).get();
          System.out.println("All tasks completed successfully. Results: ");
          results.forEach(System.out::println);

          executorService.shutdown(); // 关闭线程池

      } catch (Exception e) {
          e.printStackTrace();
      }
    }
}

这个示例首先创建了一个ListeningExecutorService实例。然后,在for循环中创建并提交了10个Callable任务。每次迭代都会将新创建的ListenableFuture添加到futures列表中。

我们还为每个future添加了回调函数,以便在任务成功或失败时执行相应的操作。最后,我们等待所有future完成,并输出它们的结果。

扩展阅读

Java实现异步编程的8种方式文章来源地址https://www.toymoban.com/news/detail-640241.html

到了这里,关于尝试一下Guava带返回值的多线程处理类ListenableFuture的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 流式计算中的多线程处理:如何使用Kafka实现高效的实时数据处理

    作者:禅与计算机程序设计艺术 Apache Kafka 是 Apache Software Foundation 下的一个开源项目,是一个分布式的、高吞吐量的、可扩展的消息系统。它最初由 LinkedIn 开发并于 2011 年发布。与其他一些类似产品相比,Kafka 有着更强大的功能和活跃的社区支持。因此,越来越多的人开始使

    2024年02月12日
    浏览(67)
  • 【微信小程序】微信小程序的接口调入 获取太阳码 根据返回值的类型进行接收,微信接口可能直接返回图片,也可能返回一个错误信息的json,同时兼容处理这两种情况

    在开发一个关于微信小程序的过程中,有一个这样的需求,要求生成微信小程序的太阳码,然而这个东西的请求方式我们是这样的:我作为后端服务去请求这个太阳码的二维码,然后将获取到的太阳码二维码的图片返回给小程序端进行接收,然后小程序端进行一个展示 原本以

    2024年02月04日
    浏览(64)
  • Java使用线程池异步处理并返回结果

    1.1、@Bean注入的线程池 1.2、注入线程池处理异步任务

    2024年02月12日
    浏览(38)
  • java多线程异步处理并获取处理后的返回值

    示例部分代码:

    2024年02月06日
    浏览(43)
  • 智能ai绘画的方法是什么?这个方法值得你尝试一下

    ai绘画是近年来随着人工智能技术的发展而兴起的一种新型艺术形式。它可以自动化地生成各种类型的绘画作品,从简单的线条图案到复杂的写实风景、肖像等,既节约了时间又提高了创作效率。那么下面这篇文章就来给大家介绍ai绘画如何生成的吧! 在介绍之前,先让我来

    2024年02月09日
    浏览(42)
  • 函数返回值的简述(简洁明了)

    返回值: 1、函数返回值 定义:函数的返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果通过return语句返回。 没有返回值的函数为空类型,用void表示。一旦函数的返回值类型被定义为 void,就不能再接收它的值,即若函数没有返回值,表达式 int 变量

    2024年02月04日
    浏览(30)
  • PDF转CAD后尺寸如何保持一致?这几种方法可以尝试一下

    CAD文件是可编辑的,可以进行修改、添加和删除,这使得在CAD软件中进行编辑更加容易和灵活。这意味着,如果需要对图纸进行修改或者添加新的元素,可以直接在CAD软件中进行操作,而不需要重新制作整个图纸。那么将PDF文件转换成CAD格式后,怎么保持尺寸一致呢?教大家

    2024年02月16日
    浏览(50)
  • 如何实现让一个函数能返回多个值的效果

    在C语言中,一个函数通常只能返回一个值。但是可以通过指针参数或结构体来模拟返回多个值的效果。 使用指针参数 :你可以将需要返回的值作为函数的参数,通过指针的形式传入,让函数将结果写入指针所指向的内存位置。 使用结构体 :你可以定义一个结构体,其中包

    2024年02月08日
    浏览(62)
  • java 泛型作为方法的返回值的封装

    业务需要,经常需要http方式调用某服务,然后某服务返回特定类型的返回内容。 类似 String resStr = xxxHttpClient.post() ,然后它返回一个字符串,你还需要反序列化成某种格式的。 返回值可以反序列化成的形式如下: 注意,这里的这个T是个活的,它可能根据接口的内容不同而不

    2024年02月10日
    浏览(45)
  • vscode自动生成返回值的快捷键

    vscode中类似idea的alt+enter功能,可以添加返回值 idea中是Introduce local variable, vscode中按下command+.(句号) 然后选extract to local variable或者 Assign statement to new local variable都行, 光标在分号前如图: 光标在分号后如图:

    2024年04月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包