ListenableFuture和countdownlatch使用example

JAVA的异步(2):guava-ListenableFuture JAVA异步实现(2):guava-ListenableFutureListenableFutureFutureCallbackSettableFuture 在JDK1.8之前,java官方一直没有提供比Future更好的异步工具(Future相关在前一篇博客中有介绍),为此google的guava库中提供了ListenableFuture作为Future的工具,在JDK1.8中增加了CompletableFuture作为对Future的补充,见下一篇博客。 本文的maven依赖如下: <depen 阅读详情

ListenableFuture可以允许你注册回调方法(callbacks),在运算(多线程执行)完成的时候进行调用, 或者在运算(多线程执行)完成后立即执行

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

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 如果需要所有的listenableFuture返回结果,可以使用countdownlatch,在Futures.addCallback的success里面把countdownlatch减1
 * 等countdownlatch=0的时候,所有的listenableFuture都计算完成
 */
public class ListenableFutureLearn2 {

    public void test3() throws Exception {
        ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool());
        // 执行任务
        final ListenableFuture<String> listenableFuture = executorService.submit(new Callable<String>() {
            public String call() throws Exception {
                for (int i = 0; i < 10000; i++) {
                    System.out.println(i);
                }
                return "success";
            }

        });
        final ListenableFuture<String> listenableFuture2 = executorService.submit(new Callable<String>() {
            public String call() throws Exception {
                for (int i = 0; i < 10000; i++) {
                    System.out.println(-i);
                }
                return "success";
            }

        });
        // 绑定任务以及回调函数
        Futures.addCallback(listenableFuture, new FutureCallback<String>() {
                    @Override
                    public void onSuccess(String result) {
                        String str = "";
                        try {
                            str = listenableFuture.get();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        }
                        System.out.println("integer:" + str);
                        System.out.println("result:" + result);
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        System.out.println("error" + t.getMessage());
                    }
                }
                , MoreExecutors.directExecutor());

        Futures.addCallback(listenableFuture2, new FutureCallback<String>() {
                    @Override
                    public void onSuccess(String result) {
                        String str = "";
                        try {
                            str = listenableFuture.get();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        } catch (ExecutionException e) {
                            e.printStackTrace();
                        }
                        System.out.println("integer:" + str);
                        System.out.println("result:" + result);
                    }

                    @Override
                    public void onFailure(Throwable t) {
                        System.out.println("error" + t.getMessage());
                    }
                }
                , MoreExecutors.directExecutor());
        TimeUnit.MILLISECONDS.sleep(500);
        System.out.println("listenableFuture:" + listenableFuture.get());
    }

    public static void main(String[] args) throws Exception {
        new ListenableFutureLearn2().test3();
    }
}
ListenableFuture:让你的Java异步操作更“听话“ 想象一下,你让朋友帮你去买杯咖啡(这是一个耗时操作)。普通Future的模式:你不停地问朋友:“咖啡买好了吗?” “买好了吗?” 直到朋友告诉你买好了,你才能拿到咖啡。这期间你啥也干不了,只能干等(这就是的阻塞方式)。ListenableFuture的模式:你告诉朋友:“咖啡买好后,直接送到我工位上就行。” 然后你就继续忙自己的事。朋友买好咖啡后,会主动把咖啡给你送过来(这就是回调)。是Google Guava库提供的一个接口,它是对Java标准Future的增强。它最大的亮点就是允许你注册回调函数。 阅读详情

相关推荐

一句话ListenableFuture简介

ListenableFuture 并发是一个难问题,但是通过强有力简单的抽象,可以简化。为了使问题简化,Guava 使用了JDK 的ListenableFuture接口。 这里强烈推荐诸位使用ListenableFuture而不是Future。原因有如下三点: 大多数的Future方法需要ListenableFuture 切换到ListenableFuture很容易 工具方法的提供者不需要...

1575

ListenableFuture使用原理

java中有几种实现异步的方式(FutureTask/ListenableFuture/CompletableFuture) 这篇介绍的是ListenableFuture,相比FutureTask,本质上只是增加了任务的回调函数,这个是google框架里面的一个东西,我用的版本是guava-27.0-jre.jar 首先还是说使用: public class ListenableFutureTes...

帅东's Blog 3万+

【信息科学与工程学】计算机科学与自动化——第八十一篇 Java分布式软件高并发/高可用算法01

4. 消息队列(如Kafka的Topic分区,本质是范围)。3. 若是ACCEPT事件,bossGroup线程接受连接,创建SocketChannel,并将其注册到workerGroup的一个EventLoop的Selector上,关注READ事件。1. 分布式缓存分片(如Redis Cluster)。4. 分布式文件存储(如Ceph CRUSH)。6. 调用栈的模拟(如协程)。3. 服务网格(如Istio)的基础。2. 本地缓存与集中式缓存(如Redis)的一致性维护。3. 静态数据(如配置)缓存。

weixin_49199313的博客 1141

浅析ListenableFuture使用场景及介绍示例

ListenableFuture是对原有Future的增强,可以用于监听Future任务的执行状况,是执行成功还是执行失败,并提供响应的接口用于对不同结果的处理。 适用场景: 1、如果一个主任务开始执行,然后需要执行各个小任务,并且需要等待返回结果,统一返回给前端,此时FutureListenableFuture作用几乎差不多,都是通过get()方法阻塞等待每个任务执行完毕返回。

石头视角 1万+

Spring番外篇-ListenableFuture

其实更好的方式是给future添加一个listener,成功或者异常后回调listener。,因为功能非常强大,性能也很优秀,Doug Lea大神对其的优化无所不用其极。这个线程池定义了两个方法返回ListenableFuture。什么情况下该使用ListenableFuture。就对原生的Future做了增强,提供了。(redis客户端)就大量地使用了。诞生于Spring4.0,晚于。在Spring团队后面创造的。,当时Netty4也晚于。所以Spring创造了。其他情况下都更推荐使用

zzzj的博客 1465

那些年我们追过的异步骚操作:ListenableFuture、CompletableFuture、RxJava(Observable)

Futures在Java 5(2004)中引入。它们是承诺在操作完成后保留操作结果的对象。调用者可以使用future对象来检查操作isDone(),或者等待它完成使用get()。Future模式一个最大的问题是何时调用问题(过早地阻塞Future.get(),这消除了异步执行的好处)。guava的 ListenableFuturejava8的CompletableFuture、RxJava的...

布道 7041

ListenableFuture

ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用ListenableFuture Guava帮我们检测Future是否完成了,如

qq_36109365的博客 1450

【并发编程】Guava - ListenableFuture,避免Future获取阻塞问题,增加回调

使用Future的实现类FutureTask想要实现一旦获取到结果立即执行后续的业务,就需要阻塞主线程等待结果或者使用其他线程循环的判断任务是否结束,这样导致性能较低,且代码负责。ListenableFuture在Future的基础上增加了任务执行后自动调用后续业务处理的逻辑,方便我们使用。通过结果可以看出,只要有任务失败,则不会执行回调方法中成功的处理逻辑,而是仅执行回调方法中失败的处理逻辑。),Guava提供的ListenableFuture支持不阻塞主线程进行任务执行完成后的业务处理。

C3Stones 1680

先进的ListenableFuture功能

上次我们熟悉了ListenableFuture 。 我答应介绍更高级的技术,即转换链接。 让我们从简单的事情开始。 假设我们有从某些异步服务获得的ListenableFuture<String> 。 我们还有一个简单的方法: Document parse(String xml) {//... 我们不需要String ,我们需要Document 。 一种方法是简单地解析Fut...

最佳 Java 编程 805

深入理解 Future, CompletableFuture, ListenableFuture,回调机制

使用 ListenableFuture 还是 CompletableFuture?各有利弊,以下是我的个人看法:如果你使用的是 JDK8 的话,不推荐使用 CompletableFuture,因为有很多方法支持不足,比如设置超时时间,虽然可以使用一些工具类实现相关功能;不如直接使用 Guava,代码不易出错,文档齐全。JDK8 以上版本,首选 CompletableFuture,需要取消机制时,可以使用 ListenableFuture 搭配 ListeningExectuorService。潜龙勿用。

2301_78976656的博客 1327

使用ListenableFuture进行异步任务执行并进行线程切换

在程序中会经常需要做一些异步任务,但是由于部分操作其实很简单,仅仅是短暂的进行异步操作,然后在结果成功或失败的时候切换回主线程进行下一步处理,这期间不能阻塞主线程。这里记录一下使用google的guava库里面的并发类进行处理,也可以,只是在Android上最低支持API23版本,但是项目最低支持21。使用来进行Java高版本兼容的话,改动比较多,一直有R8/D8兼容性错误。估计要升级jdk、gradle等等版本,在协作开发中不太合适。项目中本身就有guava。所以使用这个进行开发

Mr_Tony的专栏 1382

Google 的核心 Java 库 guava 常用工具类

目录 com.google.common.collect.Lists 工具类 com.google.common.primitives.Ints 整形操作 com.google.common.collect.Multiset Multimap 提供一个 key 对多个值 连接器 Joiner、分割器 Splitter 字符匹配器:CharMatcher com.google.comm...

蚩尤后裔-汪茂雄 2万+

Java异步编程指南

文章目录一. Future二. ListenableFuture三. CompletableFuture 在我们平时开发中或多或少都会遇到需要调用接口来完成一个功能的需求,这个接口可以是内部系统也可以是外部的,然后等到接口返回数据了才能继续其他的业务流程,这就是传统的同步模式。 同步模式虽然简单但缺点也很明显,如果对方服务处理缓慢迟迟未能返回数据,或网络问题导致响应变长,就会阻塞我们调用方的线程,导致我们主流程的耗时latency延长,传统的解决方式是增加接口的超时timeout设置,防止无限期等待。但即使

qq_24095055的博客 1276

ListenableFutureCompletableFuture简单小结

前言 最近花了点时间熟悉了下ListenableFutureCompletableFuture的使用。二者都是原生JDK中老版Future-Get模式的改进。本文将结合demo程序来直观的学习一下这两大Future的使用特点。 老版Future模式的缺点 老版Future模式一个最大的问题是需要获取结果做后续处理操作的时候,还是需要阻塞等待。这样的话,同步调用方式就没有多大区...

走在前往架构师的路上 1万+

多线程学习-ListenableFuture使用介绍以及示例

Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展。ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强(public interface ListenableFuture&lt;V&gt; extends Future&lt;V&gt;)。我们知道Futu...

weixin_34114823的博客 506

Guava(七)

【并发编程】     并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写。出于这样的考虑,Guava 定义了 ListenableFuture 接口并继承了JDK concurrent包下的 Future 接口。Guava强烈建议在代码中多使用 ListenableFuture 来代替JDK的 Future, 因为: ● 大多数 Futures 方法中需要它。 ● 转到 List...

L的博客 815
上一篇: git push命令提交代码到仓库提示输入username和password
祖国の花朵
博客等级 码龄7年 144粉丝 67原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祖国の花朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值