线程池源码剖析
2023-08-22 18:31:43 5 举报
线程池核心源码分析
作者其他创作
大纲/内容
是
直到所有的核心线程数都已创建
w = new Worker(firstTask);
2、为什么非核心线程是临时的?因为结合代码看出最后task = getTask()返回null,会跳出1中的While循环,然后干掉非核心线程
ctl 是一个原子整型的变量,占32个bit位。因为线程池总共有5种状态,必须要三个bit位才能记录,采用高三位。那么低29位用来记录工作线程的数量
return false
isRunning(c) && workQueue.offer(command)
mainLock.lock();
workers.add(w);
DiscardPolicy
如果非核心线程创建达到最大值
CallerRunsPolicy
DiscardOldestPolicy
如果队列放满
AbortPolicy
成功
判断不能超过创建的最大线程数
判断不允许创建线程的情况
失败
自旋
int c = ctl.get();
workerCountOf(c) < corePoolSize
t.start();workerStarted = true;
创建非核心线程
拒绝策略
加锁
判断工作线程是否小于核心线程数
创建核心线程
1、为什么线程可以重用?因为这里不断循环从队列中拿任务执行
① 判断线程池是否处于运行状态,因为如果是创建核心线程失败,线程池可能停止运行② 如果线程池处于运行中,就把执行任务先放到阻塞队列
getTask()
runWorker(this);
把worker丢给线程
return
Worker.run
线程启动
开始创建工作线程
mainLock.unlock();
execute
0 条评论
下一页