线程池的执行流程
2019-11-25 16:37:57 21 举报
线程池的执行流程主要包括以下几个步骤: 1. 当有新的任务提交到线程池时,首先会将任务放入任务队列中。 2. 线程池中的空闲线程会从任务队列中取出任务并执行。 3. 如果线程池中的所有线程都在执行任务,那么新的任务将会在任务队列中等待,直到有空闲线程出现。 4. 当一个线程完成任务后,它会返回线程池并等待新的任务。 5. 如果线程池关闭,那么它将不再接受新的任务,但是已经提交的任务会继续执行,直到所有任务完成。 6. 线程池的大小可以根据系统的负载情况进行动态调整,如果系统负载较大,可以增加线程池的大小以提高处理能力;如果系统负载较小,可以减少线程池的大小以节省资源。
作者其他创作
大纲/内容
0
execute
任务
1
poll/take
terminated() has completed当terminated钩子函数执行完毕,将转变状态为TERMINATED
线程池状态表示含义:
SHUTDOWN
int的32位,高3位表示状态
CAPACITY
任务执行完毕
RUNNING
是
初始化work数量,同时初始化线程池状态为RUNNING
TERMINATED
获取失败返回null
Accept new tasks and process queued tasks接受任务,执行队列中的任务
任务加入
阻塞take直到有任务加入或线程池关闭
When pool is empty
计算线程池的运行状态
类
DiscardOldestPolicy
CallerRunsPolicy
提交线程任务
TIDYING
corePool
工作队列
图参照《Java并发编程的艺术》第9章Java中的线程池-线程池执行流程
RejectedExecutionHandler
AbortPolicy
DiscardPolicy
否
拒绝策略
maximumPool
我是分割线
线程池是否已满
线程池的运行状态分解
private static final int COUNT_BITS = Integer.SIZE - 3;private static final int CAPACITY = (1 << COUNT_BITS) - 1;private static final int RUNNING = -1 << COUNT_BITS;private static final int SHUTDOWN = 0 << COUNT_BITS;private static final int STOP = 1 << COUNT_BITS;private static final int TIDYING = 2 << COUNT_BITS;private static final int TERMINATED = 3 << COUNT_BITS;
状态切换:
丢弃
根据状态和work数量进行或运算,计算int的实际值
CAPACITY,线程池允许的最大数量
2
表示线程池的状态
关闭线程池
线程
求work的数量,低29位的值
添加至workers组,并执行start方法
3
抛出异常
核心线程池是否已满/核心线程是否可以超时
线程执行结束
抛出异常直接结束
shutdown()
按照拒绝策略的实现,拒绝执行该任务
shutdownNow()
队列是否已满
STOP
主线程
超时poll()
private static int runStateOf(int c) { return c & ~CAPACITY; }
创建线程池
private static int workerCountOf(int c) { return c & CAPACITY; }
When the terminated() hook method has completed
图参照《Java并发编程的艺术》第9章Java中的线程池-线程池运行流程
核心线程池是否已满
添加至工作队列
run
When both queue and pool are empty
0 条评论
下一页