网站首页 > 精选教程 正文
线程池是Java并发编程核心,也是大厂重点考察内容,下面我就全面来详解线程池原理@mikechen
本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。
线程池
线程池(Thread Pool)是一种多线程管理技术,它维护了一组预先创建的线程,用来执行提交的任务。
在 Java 中,线程池通过 Executor 接口进行管理, Executors 工具类提供了各种方便的线程池创建方法。
比如:创建一个固定大小的线程池,当所有线程都在执行任务时,新的任务会进入任务队列等待执行。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
通过使用线程池,系统可以避免频繁创建、和销毁线程的开销,从而提高性能和响应速度。
尤其在任务短小且频繁时,通过复用线程,可以避免大量的资源消耗。
线程池的实现原理
线程池的实现原理,如下图所示:
主要包含,如下步骤:
第一步:判断核心线程是否有空闲
当有新任务提交到线程池时,线程池会首先检查核心线程池中的线程(数量为 corePoolSize)。
如下所示:
int currentPoolSize = workerCount.get();
if (currentPoolSize < corePoolSize) {
if (addWorker(command, true)) // 创建核心线程执行任务
return;
}
如果核心线程数小于 corePoolSize,或者有核心线程处于空闲状态,线程池会直接创建一个新的核心线程来执行这个任务。
第二步:判断工作队列是否已满
如果核心线程都在执行任务,且线程数量已经达到 corePoolSize,则任务不会立即创建新的线程,而是进入任务队列。
如下所示:
// 第二步:尝试将任务添加到队列
if (workQueue.offer(command)) {
int recheck = workerCount.get();
if (recheck == 0) // 如果线程池空闲,启动一个核心线程
addWorker(null, false);
}
第三步:判断线程池的最大线程数
如果任务队列已满,且线程池中的线程数少于 maximumPoolSize。
线程池会尝试创建一个新的非核心线程(即超出 corePoolSize 的线程),用于处理当前提交的任务。
如下所示:
// 第三步:如果队列满了,判断是否可以创建新的非核心线程
else if (!addWorker(command, false)) {
// 第四步:如果无法创建新的非核心线程,执行拒绝策略
reject(command);
}
第四步:拒绝策略
当任务队列已满,且线程池中的线程数已经达到 maximumPoolSize 时,线程池无法接纳更多任务,这时线程池会使用预设的 饱和策略 来处理这个任务。
// 第四步:如果无法创建新的非核心线程,执行拒绝策略
reject(command);
常见的饱和策略包括:
- AbortPolicy:默认策略,抛出 RejectedExecutionException 异常,通知提交任务的线程池已满;
- CallerRunsPolicy:让提交任务的线程自己执行这个任务,以减少新任务提交的压力;
- DiscardPolicy:直接丢弃当前提交的任务,不做任何处理;
- DiscardOldestPolicy:丢弃队列中最老的任务,然后尝试提交新任务。
线程池的注意事项
根据系统负载、CPU 核心数、和任务类型进行配置。
比如:CPU 密集型任务,可以设置 corePoolSize 接近 CPU 核心数;
I/O 密集型任务,可以设置较高的 corePoolSize,允许更多线程等待 I/O 操作。
还有一个,非常重要的阻塞队列。
无界队列,适合任务处理速度较快、不会积压太多任务的场景。
有界队列,适用于任务量高的场景,通过限制队列长度防止任务过载。
本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。
- 上一篇: java线程池原理浅析
- 下一篇: 「一文搞懂」Java线程池实现原理
猜你喜欢
- 2024-12-03 java线程池实现原理以及应用场景说明
- 2024-12-03 Java线程池详解
- 2024-12-03 一文读懂Java线程池工作原理
- 2024-12-03 Java的线程池是怎么回事?来看看这篇文章吧
- 2024-12-03 Java线程池的实现原理,你清楚么?
- 2024-12-03 一文弄懂Java中线程池原理
- 2024-12-03 一文搞懂JAVA线程池工作原理
- 2024-12-03 「一文搞懂」Java线程池实现原理
- 2024-12-03 java线程池原理浅析
- 2024-12-03 我画了25张图展示线程池工作原理和实现原理,建议先收藏再阅读
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)