由SimpleAyncTaskExecutor到ListenableFutureTask

Spring AsyncExecutor观后感

导语

本来想看下spring关于Async&Sync TaskExecutor的主要内容,看着看着发现ListenableTaskExecutor也很有意思,FutureTask也很有意思,最后发现,这个代码设计真的很有意思啊

SimpleAsyncTaskExecutor

结构图

理解SimpleAsyncTaskExecutor,先来看看它的类图和继承关系吧

在这里想要说的是:每次用户提交新的任务给SimpleAsyncTaskExecutor时,它都会启动新的线程来响应客户请求,并在处理完客户请求后自动销毁它,这就是说,它并没有提供线程池的功能,如下图

如果想要实现线程池的功能,可以自行实现 CustomizableThreadCreator 来获得需要的功能;这还不是重点,重点是发现了它的 监听Future的API,顿时想要找到原理:

ListenableFutureTask

每个listenableFutureTask既是一个任务又是一个Future,关键在于它聚合了一个策略:ListenableFutureCallbackRegistry

listenableFutureTask通过重写FutureTask的done方法,去回调ListenableFutureCallbackRegistry的onSuccess或者onFailure方法,进行回调

FutureTask

futureTask 模板了 done 方法,留给继承者去实现,很灵活,其中JDK源代码中 ExecutorCompletionService 中便聚合了QueueingFuture:

ExecutorCompletionService可以异步处理不需要有顺序的任务,最终从一个队列中获取任务执行结果。

实现思路流程图

个人觉得上边的那个图和图中的注释说的很清楚啦。

时间: 2025-01-14 12:31:48

由SimpleAyncTaskExecutor到ListenableFutureTask的相关文章

自定义的最简单的可回调的线程任务CallbackableFeatureTask(模仿google的ListenableFutureTask)

1.使该Task继承Callable,Runable import java.util.concurrent.Callable; import java.util.function.Consumer; public class CallbackableFeatureTask<V> implements Callable<V>, Runnable { private Callable<V> mainProcess; private Consumer<V> ca

GUAVA-ListenableFuture实现回调

随着软件开发的不断进步,在实际的开发应用中,可能一次请求需要查询若干次数据库或者调用若干次第三方,按照传统的串行执行的话,会大大增加响应时间,无法满足业务需求,更无法满足用户迫切需要响应迅速的愿望.对此,我们需要针对网络请求或内部调用中包含的"多任务"进行异步处理,并行去执行这些"任务",这样就就会大大减小响应时间.本文是基于guava中的ListenableFuture来实现的. 测试代码: 1 package com.study1; 2 3 import jav

Guava文档翻译之ListenableFuture

ListenableFutureExplained 并发是一个困难的问题,但是使用强大而简单的抽象可以极大地简化并发问题.为了简化事情,Guava使用ListenableFuture继承了JDK的Future接口. 我们强烈建议你在所在代码里总是使用ListenableFuture,而不是Future,因为: 大多数Future相关的接口需要它 这比以后换成ListenableFuture更容易 工具的提供者不需要为它们的方法分别提供Future和ListenableFuture的变体 接口 I

guava之cache

转自:http://ifeve.com/google-guava-cachesexplained/ 范例 01 LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 02         .maximumSize(1000) 03         .expireAfterWrite(10, TimeUnit.MINUTES) 04         .removalListener(MY_LISTENER) 05         

Guava Futures异步回调机制源码解析

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51758194 1.前言 在前两篇文章中简单阐述了Java Future 和Guava ListenableFuture及其相关的应用.我们发现Guava ListenableFuture提供了比Java Future更加强大的功能,而在Google Guava并发包中,某些情况下,Futures这个类起到了不可或缺的作用,而ListenableFuture

从Java future 到 Guava ListenableFuture实现异步调用

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51232004 前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂.针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三方接口.通常,我们处理方法是让代码同步顺序的去调取这些接口.显然,调取接口数量的增加必然会造成响应时间的增加,势必会对系统性能造成一定影响. 为

guava cache使用例子

关于介绍请参考:http://blog.csdn.net/liangrui1988/article/details/46120533# 下面是测试代码 ,下载源码可在github上获取:https://github.com/liangrui1988/guavaTest package org.rui.test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import

ExecutorService的submit方法的坑

先看一段代码: public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture<Void> ftask = newTaskFor(task, null); execute(ftask); return ftask; } protected <T> RunnableFuture<T> newTaskFor(Ru

8.2 构建客户端源码解析

准备工作: 先启动两个provider: dubbo://10.211.55.5:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&dubbo=2.5.7&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=318&revision=2