简单梳理ThreadPoolExecutor多线程提交任务、获取任务流程

以ThreadPoolExecutor类的 public <T> Future<T> submit(Runnable task, T result) 方法为例简单梳理一下流程。

通过该文希望做两件事,1是理清是怎么拿到线程的执行结果的,2线程任务的提交流程。

ThreadPoolExecutor继承AbstractExecutorService,改submit方法来自AbstractExecutorService。打开AbstractExecutorService看一下submit实现。

                                                                     图1

在上图中我们可以看到execute方法传入的是一个newTaskFor方法返回的RunableFuture对象,该对象实际上是FutureTask。同时我们也可以看到submit的返回的其实也是FutureTask对象,也就不难理解为什么能拿到线程的执行结果了。Thread.start()会调用在Runbale的run方法,也就是这里的FutureTask的Run方法。submit返回的也是FutureTask对象,两者是同一个对象,能拿到自己方法的执行结果也是很正常的事了。

FutureTask的继承关系如下图:

FutureTask的构造方法如下图,我们可以到将Runnable转换成了Callable。

Runnable转Callable的具体实现如下图,可以看到call的返回值是构造submit时提交的结果。如果在submit时传的是Callable的实现当然在FutureTask的run方法中的调用calld的时候调用的是Callable的call方法。

FutureTask 的run方法如下图

上面大概解释了怎么拿到线程的执行结果,再来看一下任务怎么提交到线程池的。

提交的动作实在图一的execute方法。在这个方法中,有三个重要方法,addWorker 创建线程,wokeQueue.offer() 将任务加入队列,reject拒绝任务。

Worker的创建,调用了在创建线程池时传入的线程工厂来创建线程,如果没有传入线程工程则使用默认工厂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值