Java线程池
线程池的目的是通过对线程的管理,让多线程程序中的多线程便捷开发、高效运行。
线程池的存在的意义
- 让线程变得可重用,减小线程创建和销毁带来的消耗。
- 线程池中保留的可用线程,无需创建过程即可立即执行,提高响应速度。
- 方便线程并发数的管控,避免创建过多的线程,从而导致占用过多资源。
- 提供定时、定期以及可控线程数等功能的线程池。
基础原理
- 将线程进行管理
- 以空间换时间
应用
ExecutorService service= Executors.newCachedThreadPool();
service.submit(()->{
System.out.println(Thread.currentThread().getName());
});
工作流程
调用shutdown()
或者shutdownNow()
关闭线程池
shutdown()
- 将线程池的状态改为
SHUTDOWN
,不再继续网线程池中添加任务,否则会抛异常。 - 线程池直到添加到线程池中的任务已经处理完毕才退出。
- 将线程池的状态改为
shutdownNow()
- 线程池状态改为
STOP
,不再继续添加新的任务。 - 终止正在执行的线程。
- 调用
Thread.interrup()
,试图停止所有正在执行的线程。
- 线程池状态改为
四种线程池
这四类常用的线程池,是预置的。
- newCachedThreadPool:可缓存的无界线程池。线程闲置60s后,将被回收。
- newFixedThreadPool:指定线程数的线程池,超出的线程将会在LinkedBlockQueue阻塞队列中等待。
- newSingleThreadExecutor:单线程执行器,保证所有的任务以FIFO、优先级等顺序执行。
- newScheduledThreadPool:指定长度线程池,支持定时、周期任务的执行。
线程池的实现原理
Executors
是个工厂方法,用于创建线程池,是通过配置ThreadPoolExecutor
来构建线程池。
public class Executors {
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
...newFixedThreadPool(...);
...newSingleThreadExecutor(...);
...newScheduledThreadPool(...);
}
corePoolSize
核心线程池大小- 提交任务时,
线程数<corePoolSize
,即使存在空闲线程,也创建线程。
- 提交任务时,
maximumPoolSize
线程池最多线程数- 当任务队列满了,并且
线程数<maximumPoolSize
,则创建新线程。无界队列忽视该参数。
- 当任务队列满了,并且
keepAliveTime,unit
线程存货保持时间,时间单位线程数>corePoolSize
的时候,线程的空闲时间超过了keepAliveTime
将被终止。
workQueue
任务队列:用于传输和保存等待执行任务的阻塞队列线程数<corePoolSize
,Exector优先生成新线程,任务不进入队列。线程数>=corePoolSize
,Exector优先考虑把任务加入队列。- 任务队列满后,考虑创建新线程。如果线程池数量超过
maximumPoolSize
,执行线程饱和策略。
threadFactory
线程创建工厂handler
线程饱和策略AbortPolicy
:处理程序遭到拒绝,并且抛出异常。CallerRunsPolicy
:调用者所在线程来运行该任务DiscardPolicy
:无法执行,抛弃任务。DiscardOldestPolicy
:FIFO,抛弃队列头部的任务。
任务队列
ArrayBlockingQueue
基于数组的有界阻塞队列- 队列按照FIFO管理任务,队列头是在队列中存货时间最长的任务。
- 该类型的工作队列一旦创建,长度固定。
LinkedBlockingQueue
基于链表的无界阻塞队列- 队列采用FIFO对工作任务进行管理。
- 基于链表的队列吞吐量通常高于数组的队列。
SynchronousQueue
同步阻塞队列- 每个插入操作必须等待另外一个线程对应的移除操作,等待过程处于阻塞状态。
- 同步阻塞队列不谈容量,
插入-移除
循环迭代执行。 Executors.newCachedThreadPool
使用了该队列。
PriorityBlockingQueue
基于优先级的无界阻塞队列- 优先级队列的工作任务按照自然顺序进行排序,也可
Comparator
构建排序规则。 - 该队列理论上无解,但是受到物理资源限制导致
OOM
- 优先级队列的工作任务按照自然顺序进行排序,也可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署