创建线程池的5种方式

线程池(ThreadPool)是一种基于池化思想管理和使用线程的机制。它是将多个线程预先存储在一个"池子"内,当有任务出现时可以避免重新创建和销毁线程所带来性能开销,只需要从"池子"内取出相应的线程执行对应的任务即可。
一、通过Executors类提供的4种方法:

newCachedThreadPool(创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。)

newFixedThreadPool(创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。)

newScheduledThreadPool(创建一个定长线程池,支持定时及周期性任务执行。)

newSingleThreadExecutor(创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。)
二、通过ThreadPoolExecutor类自定义:

ThreadPoolExecutor类提供了4种构造方法,可根据需要来自定义一个线程池。

如何使用线程池:

线程池使用有很多种方式,不过按照《Java 开发手册》描述,尽量还是要使用 ThreadPoolExecutor 进行创建。

【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让我们更加明确线程池的运行规则,规避资源耗尽的风险。
说明:Executors 返回的线程池对象的弊端如下:

1) FixedThreadPool 和 SingleThreadPool:

允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM(内存溢出)。

2) CachedThreadPool:

允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM(内存溢出)。

池化思想在计算机的应用也比较广泛,比如以下这些:

内存池(Memory Pooling):预先申请内存,提升申请内存速度,减少内存碎片。

连接池(Connection Pooling):预先申请数据库连接,提升申请连接的速度,降低系统的开销。

实例池(Object Pooling):循环使用对象,减少资源在初始化和释放时的昂贵损耗。
线程池的优势主要体现在以下 4 点:

降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。

提高响应速度:任务到达时,无需等待线程创建即可立即执行。

提高线程的可管理性:可以控制线程数,有效的提升服务器的使用资源,避免由于资源不足而发生宕机等问题。

提供更多更强大的功能:比如延时定时线程池ScheduledThreadPoolExecutor,就允许任务延期执行或定期执行。
ThreadPoolExecutor的内部工作原理及相关参数

主要参数为:核心线程数、阻塞队列、最大线程数、拒绝策略。

相关推荐
超梦dasgg4 分钟前
Sentinel生产环境实战全解
java·微服务·sentinel
青云计划6 分钟前
MySQL技术文档
java·mysql
qq_2518364577 分钟前
基于java 汽车检修管理系统设计与实现 论文
java·开发语言·汽车
量子炒饭大师11 分钟前
【Linux系统编程】Cyberpunk在霓虹丛林中构建堡垒 ——【基础开发工具(1)】一文带你初步了解 软件包管理器 并 快速上手 yum和apt 工具
java·linux·运维·apt·yum·软件包管理器
Finger#0000FF16 分钟前
从零上手VibeCoding(ClaudeCode+DeepSeek V4.Pro)
java·人工智能·ai编程·vibe coding·claudecode
木子墨51616 分钟前
系统设计面试 | 实现一个限流器:滑动窗口 → 令牌桶 → 漏桶
java·开发语言·数据结构·数据库·面试·职场和发展
吴声子夜歌28 分钟前
Java——synchronized
java·synchronized
不知名的忻35 分钟前
交换排序:冒泡排序 vs 快速排序(Java)
java·算法·排序算法
程序员阿明36 分钟前
spring boot + vue3 实现RSA加密解密
java·spring boot·后端
wok1571 小时前
IDEA 无法识别 OkHttpClient?cannot resolve symbol问题解决
java·ide·intellij-idea