都硎唷 发表于 2026-1-15 07:20:03

线程池以及HashTable, HashMap, ConcurrentHashMap之间的区别

什么是线程池

线程池(Thread Pool)是一种线程使用模式,提前创建一定数量的线程并进行复用,统一管理线程的创建、销毁和调度,从而:


[*]降低线程创建和销毁的开销
[*]提高程序响应速度
[*]防止线程数量失控导致系统资源耗尽
线程池的核心参数


[*]Java中线程池的核心实现类是 ThreadPoolExecutor。
public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler
)
[*]corePoolSize(核心线程数)


[*]线程池中长期存活的线程数量
[*]即使空闲,也不会被销毁(除非设置允许回收)
[*]作用:保证线程池的基本处理能力

[*]maximumPoolSize(最大线程数)


[*]线程池中允许存在的最大线程数量
[*]当任务很多、队列已满时,才会创建新线程
[*]作用:限制线程数量,防止资源耗尽

[*]keepAliveTime(空闲存活时间)


[*]非核心线程空闲时,最多存活时间
[*]超过该时间将被回收

[*]unit(时间单位)


[*]keepAliveTime 的时间单位
[*]如:TimeUnit.SECONDS

[*]workQueue(任务队列)


[*]用于存放等待执行的任务
[*]常见实现:
队列特点LinkedBlockingQueue无界队列(可能 OOM)ArrayBlockingQueue有界队列SynchronousQueue不存任务,直接交给线程DelayQueue延时任务
[*]threadFactory(线程工厂)


[*]用于创建线程
[*]可自定义线程名、优先级、是否守护线程
[*]方便排查问题、日志定位

[*]handler(拒绝策略)


[*]当线程池线程数已满 + 队列已满时触发。
策略行为AbortPolicy抛异常(默认)CallerRunsPolicy调用者自己执行DiscardPolicy直接丢弃任务DiscardOldestPolicy丢弃最早任务线程池的工作流程


[*]线程池处理任务的完整逻辑可总结为5个步骤:
flowchart TD    A[提交任务] --> B{核心线程池是否满?}    B -- 否 --> C[创建核心线程执行任务]    B -- 是 --> D{任务队列是否满?}    D -- 否 --> E[任务加入队列等待]    D -- 是 --> F{线程池是否达到最大线程数?}    F -- 否 --> G[创建非核心线程执行任务]    F -- 是 --> H[执行拒绝策略]Executors创建常见线程池


[*]Java提供了Executors工具类,快速创建线程池(但生产环境不推荐直接使用)。

[*]FixedThreadPool(固定大小线程池)
ExecutorService pool = Executors.newFixedThreadPool(5);

[*]特点

[*]线程数量固定
[*]使用 无界队列 LinkedBlockingQueue

[*]风险

[*]任务过多可能 OOM(内存溢出)

[*]适用场景

[*]任务量稳定
[*]并发数可控


[*]SingleThreadExecutor(单线程池)
ExecutorService pool = Executors.newSingleThreadExecutor();

[*]特点

[*]只有一个线程
[*]保证任务顺序执行

[*]风险

[*]任务堆积可能 OOM(内存溢出)


[*]CachedThreadPool(缓存线程池)
ExecutorService pool = Executors.newCachedThreadPool();

[*]特点

[*]线程数不固定
[*]空闲线程 60s 回收
[*]使用 SynchronousQueue

[*]风险

[*]线程数无限增长,容易耗尽CPU


[*]ScheduledThreadPool(定时线程池)
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);

[*]特点:支持定时、周期任务
HashTable, HashMap, ConcurrentHashMap 之间的区别

主要区别:

对比点HashtableHashMapConcurrentHashMap线程安全安全不安全安全实现方式数组+链表数组+链表+红黑树 (JDK 1.8)数组+链表+红黑树 + CAS + synchronized锁的粒度synchronized 整表加锁无锁分段锁/桶级锁 (锁定头节点)性能最差最好高并发下最好允许 key 为 null不允许允许 1 个不允许允许 value 为 null不允许允许不允许是否推荐使用不推荐推荐(单线程)推荐(并发)扩容机制整体扩容,扩容时阻塞所有操作整体扩容,扩容时阻塞所有操作分段 / 分桶扩容,不阻塞全部操作
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

孟茹云 发表于 2026-1-15 14:05:12

yyds。多谢分享

撒阗奕 发表于 2026-1-18 05:31:31

热心回复!

盖彗云 发表于 2026-1-18 09:15:03

鼓励转贴优秀软件安全工具和文档!

闵雇 发表于 2026-1-18 21:06:28

感谢分享,下载保存了,貌似很强大

顾星 发表于 2026-1-21 02:40:46

不错,里面软件多更新就更好了

卢莹洁 发表于 2026-1-23 05:48:43

前排留名,哈哈哈

笃迩讦 发表于 2026-1-23 20:52:20

收藏一下   不知道什么时候能用到

怃膝镁 发表于 2026-1-28 16:57:03

yyds。多谢分享

纣捎牟 发表于 2026-1-30 02:09:25

用心讨论,共获提升!

揿纰潦 发表于 2026-2-4 03:20:55

不错,里面软件多更新就更好了

艾晓梅 发表于 2026-2-4 22:29:55

分享、互助 让互联网精神温暖你我

湄圳啸 发表于 2026-2-6 08:52:38

不错,里面软件多更新就更好了

啖曼烟 发表于 2026-2-6 12:42:35

感谢分享

富账慕 发表于 2026-2-8 03:24:31

yyds。多谢分享

纪音悦 发表于 2026-2-8 09:02:35

分享、互助 让互联网精神温暖你我

坡琨 发表于 2026-2-8 18:31:39

yyds。多谢分享

简千叶 发表于 2026-2-8 22:59:34

懂技术并乐意极积无私分享的人越来越少。珍惜

酝垓 发表于 2026-2-9 16:47:03

鼓励转贴优秀软件安全工具和文档!

鞭氅 发表于 2026-2-9 21:15:57

前排留名,哈哈哈
页: [1] 2
查看完整版本: 线程池以及HashTable, HashMap, ConcurrentHashMap之间的区别