线程池以及HashTable,HashMap,ConcurrentHashMap之间的区别
什么是线程池
线程池(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 之间的区别
主要区别:

文章转载自:我会替风去
更多推荐



所有评论(0)