线程池源码分析

API

通常的创建方式:
在这里插入图片描述
调用的是ThreadPoolExecutor类的构造方法,只是预设了几个参数供大部分情况使用:
在这里插入图片描述
线程池执行方法:
在这里插入图片描述
Task类数据结构
调用submit(),因为ThreadPoolExecutor继承了AbstractExecutorService类,这是父类的方法:
AbstractExecutorService的submit方法构造
在实际情况我们一般使用1、2种方法,在这里我使用第一种方法,传入Callable

源码分析

AbstractExecutorService的submit方法
在这里插入图片描述
在这里插入图片描述
将传入的Callable封装成FutureTask,FutureTask实现了RunnableFuture,RunnableFuture又继承了Runnable和Future,最终封装成的结构为:
ftask变量结构
进入execute方法,将封装的FutureTask对象传入:
在这里插入图片描述
首先判断当前线程数量小于核心池数量,如果小于进入addWorker方法:
addWork方法-1
addWork方法-2
简单阐述一下这段代码:
1.通过CAS改变了线程池当前线程数
2.将FutreTask对象传入Worker类的构造函数(Worker是在ThreadPoolExecutor中的内部类)并且通过线程工厂(这里使用默认工厂)新建了一条线程,并将自身传入
Worker类
3.通过加锁,保证线程安全,将新建线程放入HashSet workers集合中
4.调用新建线程执行方法:在这里插入图片描述
5.我们看一下Worker的核心方法:
在这里插入图片描述
核心runWorker方法
这里就是线程去获取阻塞队列中的FutureTask,并调用它的run方法:
FutureTask的run方法
最终会调用到我们实现了Callable的自定义类其中的call方法,最后调用成功没有被中断,会将结果返回,并且如果主线程调用了futureTask.get()获取数据而且阻塞了,会唤醒主线程。完成了此条任务,会继续从workQueue阻塞队列中去获取任务,如果没有的话,线程阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值