FutureTask的用法及两种常用的使用场景
来源:互联网 发布:手机数据分区损坏修复 编辑:程序博客网 时间:2024/06/05 06:31
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。
1. FutureTask执行多任务计算的使用场景
利用FutureTask和ExecutorService,可以用多线程的方式提交计算任务,主线程继续执行其他任务,当主线程需要子线程的计算结果时,在异步获取子线程的执行结果。
2. FutureTask在高并发环境下确保任务只执行一次
在很多高并发的环境下,往往我们只需要某些任务只执行一次。这种使用情景FutureTask的特性恰能胜任。举一个例子,假设有一个带key的连接池,当key存在时,即直接返回key对应的对象;当key不存在时,则创建连接。对于这样的应用场景,通常采用的方法为使用一个Map对象来存储key和连接池对应的对应关系,典型的代码如下面所示:
在上面的例子中,我们通过加锁确保高并发环境下的线程安全,也确保了connection只创建一次,然而确牺牲了性能。改用ConcurrentHash的情况下,几乎可以避免加锁的操作,性能大大提高,但是在高并发的情况下有可能出现Connection被创建多次的现象。这时最需要解决的问题就是当key不存在时,创建Connection的动作能放在connectionPool之后执行,这正是FutureTask发挥作用的时机,基于ConcurrentHashMap和FutureTask的改造代码如下:
经过这样的改造,可以避免由于并发带来的多次创建连接及锁的出现。
0 0
- FutureTask的用法及两种常用的使用场景
- FutureTask的用法及两种常用的使用场景
- 在前端使用JSON两种常用场景的分析
- 15-Category的使用场景及用法
- FutureTask的用法
- JAVAWEB两种跳转方式的区别及常用的一些场景
- Java进阶之FutureTask的用法及解析
- FutureTask、ExecutorService的使用
- FutureTask的使用
- FutureTask的使用示例
- FutureTask的使用
- iOS 代理方法声明的两种形式:加号,减号,及使用场景说明
- (七)实际项目中常用的加密算法及使用场景
- (七)实际项目中常用的加密算法及使用场景
- 实际项目中常用的加密算法及使用场景
- jquery on的两种常用用法
- Java中的Runnable、Callable、Future、FutureTask的区别和CompletionService的使用场景
- android之Futuretask、Timer、AsyncTask的使用及原理解析
- 静态图片检索【1】
- Android 保存信息到系统通讯录的实现
- c++多态总结
- poj 2777 Count Color(线段树)
- odom->base_link
- FutureTask的用法及两种常用的使用场景
- 疑问三
- java 大数类 总结 整数小数(BigInteger和BigDecimal)
- Android N, Eclipse 中 File Explorer无法显示文件列表
- LeetCode No.216 Combination Sum III
- C++赋值操作符无重载情况下可能调用构造函数实现赋值的默认行为
- [leetcode]290. Word Pattern
- 最小二乘回归树 属性选择比率 gbdt基分类器 java
- ubuntu开启mysql外部访问权限