服务器之家

服务器之家 > 正文

Java线程池FutureTask实现原理详解

时间:2021-04-01 12:25     来源/作者:那个天真的人

前言

线程池可以并发执行多个任务,有些时候,我们可能想要跟踪任务的执行结果,甚至在一定时间内,如果任务没有执行完成,我们可能还想要取消任务的执行,为了支持这一特性,threadpoolexecutor提供了 futuretask 用于追踪任务的执行和取消。本篇介绍futuretask的实现原理

类视图

为了更好的理解futuretask的实现原理,这里先提供几个重要接口和类的结构,如下图所示:

Java线程池FutureTask实现原理详解

runnableadapter

threadpoolexecutor提供了submit接口用于提交任务,submit支持runnable和callable两种不同的接口,为了提供统一的对外接口,jdk在内部把runnable给包装成了一个callable,这一切是通过runnableadapter这个适配器来实现的。如下为runnableadapter的源码:

?
1
2
3
4
5
6
7
8
9
10
11
12
static final class runnableadapter<t> implements callable<t> {
    final runnable task;
    final t result;
    runnableadapter(runnable task, t result) {
      this.task = task;
      this.result = result;
    }
    public t call() {
      task.run();
      return result;
    }
  }

runnableadapter是callable 的实现类,实现了call方法,而call方法仅仅是调用task.run(),然后return result,这样就能够确保在内部只需要统一处理callable接口。

futuretask实现原理

通过上一小节的了解,我们知道提交的runnable任务在内部统一被转换为callable任务。查看submit方法的返回值,为一个future,实际上这个futrue为futuretask实例,通过此实例,调用get方法,可以阻塞当前线程,直到任务运行完毕,返回结果。

整个调用链条如下所示:

worker thread -> futuretask.run() -> callable.call() -> task.run()

如果提交的是callable任务,则只有前面三个调用。

为了更好的展示整个流程,下面举例演示一遍执行流程。

1、 向线程池submit一个callable任务(runnable也会被转为callable), 这时候callable被传入一个futuretask实例中,如下所示:

Java线程池FutureTask实现原理详解

2、线程池使用一个线程,执行这个 futuretask 任务,

Java线程池FutureTask实现原理详解

线程执行任务过程比较简单,最终会调用callable.call()或者是 runnable.run()方法,然后得到一个结果,把结果存储在futuretask实例的outcome属性中,同时把状态修改为normal,表明任务已经执行完毕,可以获取结果了。

我们假设在执行 callable.call() 过程中有多个线程调用了 同个futuretask实例的get方法,这时候,这些线程会被阻塞,存于一个栈中, 如下图所示:

Java线程池FutureTask实现原理详解

线程1,2,3调用futuretask.get方法,由于任务未执行结束,这时候,三个线程都将被阻塞休眠,futuretask中有一个栈,用于存放等待线程,栈顶指针为 futuretask.waiters引用,当任务执行完毕后,会迭代唤醒整个栈中的线程,这时候,各个线程都将被唤醒,并且可以顺利拿到任务的执行结果(执行结果存于 futuretask.outcome)

futuretask还支持任务的取消功能,这一切都是通过 futuretask的state状态来协调多个线程的。

总结

futuretask接口是一种实现机制,提供我们对任务的执行的跟踪以及控制,相比于线程池本身,比较简单,相信不难理解。

以上就是本文关于java线程池futuretask实现原理详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/yanyan19880509/article/details/52728263

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部