ListenableFuture和countdownlatch使用example

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

java 复制代码
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();
    }
}
相关推荐
satan–0几秒前
R语言的下载、安装及环境配置(Rstudio&VSCode)
开发语言·windows·vscode·r语言
电饭叔33 分钟前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
Eternal-Student34 分钟前
everyday_question dq20240731
开发语言·arm开发·php
极客先躯38 分钟前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
卑微求AC1 小时前
(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题
c语言·开发语言
夜月行者1 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_2 小时前
SpringMVC
java·spring