Java并发编程系列文章
欢迎大家观看我的博客,会不断的修正和更新文章,也欢迎大家一起交流
- Java并发编程系列 | 原子操作的底层原理
- Java并发编程系列 | volatile关键字的底层原理
- Java并发编程系列 | synchronized的锁升级过程
- Java并发编程系列 | 线程池原理详解
Java线程池原理详解
FutureTask简介
依旧是在看hystrix源码的时候,看到它底层实现用到了FutureTask,以前只是学习的时候写了几个示例,实际项目中也很少用到这个类,但是既然一些框架底层用到了这些感觉还是比较重要的,学一下底层的原理。
FutureTask的使用主要是在执行异步任务的基础上实现了带返回值的功能,相对于之前使用Thread和ThreadPool来说,可以异步执行任务,并且在想要获得结果的时候再等待其执行完返回结果。
所以,接下来就通过源码,来分析一下下面的几个问题:
- FutureTask的运行原理
- get和带超时的get的实现原理
- 多个线程调用get
运行流程
先从run方法开始看起
public void run() {
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
return;
try {
Callable<V> c = callable;//获取传入进来的Callable任务
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();//执行Callable任务
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);//将捕获到的异常记录下来