ThreadPoolExecutor线程池源码流程图
2024-04-17 17:54:57 3 举报
ThreadPoolExecutor线程池源码流程图
作者其他创作
大纲/内容
判断线程池运行状态,和阻塞队列是否放的下isRunning(c) && workQueue.offer(command)
while 条件不成立时
true
this.firstTask = firstTask; this.thread = getThreadFactory().newThread(this);
addWorker
false
return false
创建工作线程w = new Worker(firstTask);final Thread t = w.thread;
启动线程t.start();
new Worker(firstTask)
拿到提交的任务Runnable task = w.firstTask;
getTask()
循环从阻塞队列中获取任务
存放提交的任务线程workers.add(w);
获取线程池中的线程数量int c = ctl.get();
工作线程数量是否小于设置的核心线程数workerCountOf(c) < corePoolSize
线程核心代码,实现线程池中线程的存储,线程复用、线程超时关闭while (task != null || (task = getTask()) != null)
线程池几个重要属性字段:1. AtomicInteger ctl; 记录线程状态和线程池中的线程数量,高三位记录线程池状态,低29 位记录线程池中的线程数量2. final int COUNT_BITS = Integer.SIZE - 3; 常数值 293. int RUNNING = -1 << COUNT_BITS; 线程池处于RUNNING状态,其高三位值为:1114. int SHUTDOWN = 0 << COUNT_BITS; 线程池处于SHUTDOWN 状态,其高三位为:0005. int STOP = 1 << COUNT_BITS; 线程处于STOP状态,其高三位为:0016. int TIDYING = 2 << COUNT_BITS; 线程处于TIDYING状态, 其高三位为:0107. int TERMINATED = 3 << COUNT_BITS; 线程处于 TERMINATED 状态,其高三位为 0118. HashSet<Worker> workers ; 存放提交的任务线程
获取线程池中的线程数量int wc = workerCountOf(c);
Worker.run()
如果条件成立,就会去执行提交的任务,如果不成立线程执行完接下来的资源释放操作就结束了。核心就在getTask()这个方法
线程池中的线程数据加1compareAndIncrementWorkerCount(c)
执行提交的任务task.run();
// 执行任务execute(Runnable command)
判断线程数量是否大于线程容量;如果当前创建的是核心线程,和设置的核心线程数比较如果当前创建的是非核心线程,就和最大线程数比较wc >= CAPACITY || wc >= (core ? corePoolSize : maximumPoolSize)
wc > corePoolSize: 当前线程池中的线程数如果大于核心线程数说明当前创建的线程是非核心线程,需要超时关闭线程allowCoreThreadTimeOut:允许核心线程超时关闭,也就是我们设置线程池的这个属性为true时,核心线程也会超时关闭boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
拒绝策略reject(command);
runWorker(this);
0 条评论
下一页