什么是线程池
线程池(Thread Pool)是一种线程使用模式,提前创建一定数量的线程并进行复用,统一管理线程的创建、销毁和调度,从而:
降低线程创建和销毁的开销
提高程序响应速度
防止线程数量失控导致系统资源耗尽
线程池的核心参数
Java中线程池的核心实现类是 ThreadPoolExecutor。
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler )1、corePoolSize(核心线程数)
线程池中长期存活的线程数量
即使空闲,也不会被销毁(除非设置允许回收)
作用:保证线程池的基本处理能力
2、maximumPoolSize(最大线程数)
线程池中允许存在的最大线程数量
当任务很多、队列已满时,才会创建新线程
作用:限制线程数量,防止资源耗尽
3、keepAliveTime(空闲存活时间)
非核心线程空闲时,最多存活时间
超过该时间将被回收
4、unit(时间单位)
keepAliveTime 的时间单位
如:TimeUnit.SECONDS
5、workQueue(任务队列)
用于存放等待执行的任务
常见实现:
6、threadFactory(线程工厂)
用于创建线程
可自定义线程名、优先级、是否守护线程
方便排查问题、日志定位
7、handler(拒绝策略)
当线程池线程数已满 + 队列已满时触发。
线程池的工作流程
线程池处理任务的完整逻辑可总结为5个步骤:
Executors创建常见线程池
Java提供了Executors工具类,快速创建线程池(但生产环境不推荐直接使用)。
1、FixedThreadPool(固定大小线程池)
ExecutorService pool = Executors.newFixedThreadPool(5);特点线程数量固定使用 无界队列 LinkedBlockingQueue
风险任务过多可能 OOM(内存溢出)
适用场景任务量稳定并发数可控
2、SingleThreadExecutor(单线程池)
ExecutorService pool = Executors.newSingleThreadExecutor();特点只有一个线程保证任务顺序执行
风险任务堆积可能 OOM(内存溢出)
3、CachedThreadPool(缓存线程池)
ExecutorService pool = Executors.newCachedThreadPool();特点线程数不固定空闲线程 60s 回收使用 SynchronousQueue
风险线程数无限增长,容易耗尽CPU
4、ScheduledThreadPool(定时线程池)
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);特点:支持定时、周期任务
HashTable, HashMap, ConcurrentHashMap 之间的区别
主要区别:
文章转载自:我会替风去
原文链接:https://www.cnblogs.com/xi-yongqi/p/19484107
体验地址:http://www.jnpfsoft.com/?from=001YH