Java线程池的使用及工作原理
Java架构师社区
共 6016字,需浏览 13分钟
·
2021-08-12 11:21
关注我们,设为星标,每天7:30不见不散,架构路上与您共享 回复"架构师"获取资源
前言
什么是线程池?
线程池要解决什么问题?
线程池的使用
线程池的创建
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
常用阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
线程工厂
ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix("myThread-").build();
拒绝策略
线程池的执行逻辑
// 创建线程工厂
ThreadFactory threadFactory = ThreadFactoryBuilder.create().setNamePrefix("myThread-").build();
// 创建线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), threadFactory, new ThreadPoolExecutor.AbortPolicy());
execute()方法
// 组合值;保存了线程池的工作状态和工作线程数
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
public void execute(Runnable command) {
// 任务为空 抛出NPE
if (command == null)
throw new NullPointerException();
// 获取线程池状态
int c = ctl.get();
// 如果工作线程数小于核心线程数就创建新线程
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
// 如果线程池处于Running状态,就把任务放在队列尾部
if (isRunning(c) && workQueue.offer(command)) {
// 重新检查线程池状态
int recheck = ctl.get();
// 如果线程池不是Running状态,就移除刚才添加的任务,并执行拒绝策略
if (! isRunning(recheck) && remove(command))
reject(command);
// 是Running状态,就添加线程
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
// 添加任务失败,执行拒绝策略
else if (!addWorker(command, false))
reject(command);
}
// addWorker()完成线程的创建
执行流程
文章来源:https://blog.csdn.net/lhc_makefunny/article/details/117308066
到此文章就结束了。如果今天的文章对你在进阶架构师的路上有新的启发和进步,欢迎转发给更多人。欢迎加入架构师社区技术交流群,众多大咖带你进阶架构师,在后台回复“加群”即可入群。
这些年小编给你分享过的干货
2.ERP系统,自带进销存+财务+生产功能,拿来即用(附源码)
3.带工作流的SpringBoot后台管理项目快速开发(附源码)
4.最好的OA系统,拿来即用,非常方便(附源码)
5.SpringBoot+Vue完整的外卖系统,手机端和后台管理,附源码!
6.SpringBoot+Vue 可视化拖拽编辑的大屏项目(附源码)
转发在看就是最大的支持❤️
评论