Spring番外篇-ListenableFuture

1. ListenableFuture是什么?

对原生JDKjava.util.concurrent.Future的增强
原生Future只提供了

  1. 阻塞等待结果
  2. 阻塞定时等待结果
  3. 取消

其实更好的方式是给future添加一个listener,成功或者异常后回调listener

ListenableFuture就对原生的Future做了增强,提供了successCallbackFailureCallback

ListenableFuture诞生于Spring4.0,晚于jdk1.8,当时并没有java.util.concurrent.CompletableFuture这样更强大的Future

所以Spring创造了ListenableFuture

PS:
在Netty中也有一个可以监听的Future:io.netty.util.concurrent.Promise,当时Netty4也晚于jdk1.8

在Spring团队后面创造的lettcue(redis客户端)就大量地使用了CompletableFuture

2. 如何使用ListenableFuture

2.1 封装成ListenableFutureTask后提交给线程池

    @Test
    public void direct_use() throws Exception {

        // 创建Task
        ListenableFutureTask<Integer> task = new ListenableFutureTask<>(new CalculateTask(1, 2, Integer::sum));

        // 添加回调
        task.addCallback(new ListenableFutureCallback<Integer>() {

            @Override
            public void onFailure(Throwable ex) {
                System.out.println("Calculate failed , error : " + ex);
            }

            @Override
            public void onSuccess(Integer result) {
                System.out.println("Calculate success , result : " + result);
            }

        });

        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(1);

        // 提交任务
        executorService.submit(task);

        // 关闭线程池
        executorService.shutdownNow();
        executorService.awaitTermination(1, TimeUnit.MINUTES);
    }

    private static class CalculateTask implements Callable<Integer> {

        private final int x;

        private final int y;

        private final BiFunction<Integer, Integer, Integer> operate;

        public CalculateTask(int x, int y, BiFunction<Integer, Integer, Integer> operate) {
            this.x = x;
            this.y = y;
            this.operate = operate;
        }

        @Override
        public Integer call() throws Exception {
			TimeUnit.SECONDS.sleep(1);	
			
            return operate.apply(x, y);
        }

    }

2.2 使用spring的AsyncListenableTaskExecutor

这个线程池定义了两个方法返回ListenableFuture

	ListenableFuture<?> submitListenable(Runnable task);
	
	<T> ListenableFuture<T> submitListenable(Callable<T> task);
    @Test
    public void listenable_task_executor() throws Exception {

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        // 提交任务
        ListenableFuture<Integer> task = executor.submitListenable(new CalculateTask(1, 0, Integer::divideUnsigned));

        // 添加回调
        task.addCallback(new ListenableFutureCallback<Integer>() {

            @Override
            public void onFailure(Throwable ex) {
                System.out.println("Calculate failed , error : " + ex);
            }

            @Override
            public void onSuccess(Integer result) {
                System.out.println("Calculate success , result : " + result);
            }

        });

        // 关闭线程池
        executor.setAwaitTerminationSeconds(10);
        executor.shutdown();
        
    }

3. 一点小建议

什么情况下该使用ListenableFuture

  1. jdk < 1.8时,因为CompletableFuturejdk1.8才被创造的
  2. 场景较为简单时,只是需要简单的回调,ListenableFuture相比较CompletableFuture更易读,更简洁

其他情况下都更推荐使用CompletableFuture,因为功能非常强大,性能也很优秀,Doug Lea大神对其的优化无所不用其极。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.springframework.core-3.1.0是Spring框架的一个核心模块,用于提供核心的功能和工具。它包含了一些基础类和接口,用于支持Spring框架的其他模块的运行。 其中,org.springframework.core-3.1.0模块包括以下几个重要的功能: 1. 依赖注入机制:org.springframework.core-3.1.0提供了Spring框架中的依赖注入机制。通过使用它提供的注解和配置方式,可以实现对象之间的解耦和依赖关系的管理,从而降低代码的耦合度,提高代码的可重用性和可维护性。 2. 类型转换:org.springframework.core-3.1.0还提供了类型转换的功能。它包含了一些类型转换的工具类,可以方便地进行各种类型之间的转换操作,如字符串到数字的转换、日期类型的转换等。 3. 资源管理:org.springframework.core-3.1.0提供了资源管理的功能。它包含了一些基础的资源接口和实现类,用于加载和管理应用程序中的各种资源,如文件、URL、类路径下的资源等。 4. 注解处理:org.springframework.core-3.1.0还提供了注解处理的功能。它包含了一些注解处理的工具类和接口,可以方便地进行注解的解析和处理,实现一些特定的功能,如AOP切面、事务管理等。 总之,org.springframework.core-3.1.0是Spring框架中一个非常重要的核心模块,提供了许多基础的功能和工具,用于支持整个Spring框架的运行和扩展。它的存在为开发人员提供了便捷的开发方式和丰富的功能选择,提高了软件开发的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值