由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可以异步处理不需要有顺序的任务,最终从一个队列中获取任务执行结果。
实现思路流程图
个人觉得上边的那个图和图中的注释说的很清楚啦。
由SimpleAyncTaskExecutor到ListenableFutureTask的更多相关文章
- 自定义的最简单的可回调的线程任务CallbackableFeatureTask(模仿google的ListenableFutureTask)
1.使该Task继承Callable,Runable import java.util.concurrent.Callable; import java.util.function.Consumer; ...
- spring websocket源码分析续Handler的使用
1. handler的定义 spring websocket支持的消息有以下几种: 对消息的处理就使用了Handler模式,抽象handler类AbstractWebSocketHandler.jav ...
- spring websocket源码分析
什么是websocket? 摘录于wiki[1]: WebSocket is a protocol providing full-duplex communication channels over ...
- Guava文档翻译之ListenableFuture
ListenableFutureExplained 并发是一个困难的问题,但是使用强大而简单的抽象可以极大地简化并发问题.为了简化事情,Guava使用ListenableFuture继承了JDK的Fu ...
- 如何通过Maven的Tomcat插件运行Web工程
去tomcat官网http://tomcat.apache.org/,左侧栏Apache Tomcat下的Maven Plugin,点进去选择最新版本Version 2.2 通过介绍可知,使用tomc ...
- 从Stage角度看cassandra write
声明 文章发布于CSDN cassandra concurrent 具体实现 cassandra并发技术文中介绍了java的concurrent实现,这里介绍cassandra如何基于java实现ca ...
- 读Cassandra源码之并发
java 并发与线程池 java并发包使用Executor框架来进行线程的管理,Executor将任务的提交与执行过程分开,直接使用Runnable表示任务.future获取返回值.ExecutorS ...
- Guava future
减少主函数的等待时间,使得多任务能够异步非阻塞执行 ListenableFuture是可以监听的Future,它是对java原生Future的扩展增强.Future表示一个异步计算任务,当任务完成时可 ...
- Dubbo源码解析之registry注册中心
阅读须知 dubbo版本:2.6.0 spring版本:4.3.8 文章中使用/* */注释的方法会做深入分析 正文注册中心是Dubbo的重要组成部分,主要用于服务的注册与发现,我们可以选择Redis ...
随机推荐
- jQuery插件:模拟select下拉菜单
没搞那么复杂,工作中,基本够用.. <!doctype html> <html> <head> <meta charset="utf-8" ...
- sql server命令行
http://www.cnblogs.com/bingcaihuang/archive/2011/01/31/1948222.html http://www.cnblogs.com/wontonJ/a ...
- WPF Litbox样式和模板
1.在项目中使用ListBox时,经常会将ItemContainerStyle和ItemTemplate的作用搞混,ItemTemplate可以搞定一切好似ItemContainerStyle有点多余 ...
- 移动端使用HTML5表单增强体验
我们知道,HTML5新增了许多表单类型,如: number,email,url,tel,datetime,month,datetime-local等等,像datetime,month这些非常方便,免得 ...
- windows环境下配置php和redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. 一.Window 下安装 下载地址:https://github.com/dmajkic/redis/downl ...
- WCF多种调用方式兼容
1.能被ajax get 2.能post 3.wcf正常调用 实现: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompati ...
- 树莓派 LED+蜂鸣+声音传感器+红外模块组合打造声控/红外控制LED
昨天搞了控制LED,玩了第一个,剩下的就感觉很简单了,这里记录一下 先来几张照片 玩了蜂蜜模块才发现规律,一般这种模块,都会有三个针脚,VCC(3.3V或5V供电输出针脚).GNC(对应GPIO针脚的 ...
- 安卓模拟器bluestack 换imei
有好多种方法,下面介绍2种 第一种方法 通过靠谱助手设置,非常简单. 第二种方法 1.解压 root_20121221文件夹,将Root.fs 覆盖到 win7路径:C:\Progra ...
- `cocos2dx非完整` 开始自己的FW模块
上一篇的文章中说到了一些个人习惯的东西以及一些简单的项目配置,这一篇文章我们来进一步完善一些东西.首先,打开编译以后的客户端执行,会看到一大堆的fileutils加载luac文件的提示,在终端显示一大 ...
- sass调试--页面看到sass文件而不是css文件问题
在浏览器页面有时看到sass文件而不是css文件问题,其主要由于sass开启了source-map(调试)功能,问题如下图: sass调试 sass调试需要开启编译时输出调试信息和浏览器调试功能,两者 ...