Java四种线程池的使用详解
发布时间 - 2026-01-11 03:02:31 点击率:次Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(1) newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
try {
Thread.sleep(index * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cachedThreadPool.execute(new Runnable() {
public void run() {
System.out.println(index);
}
});
}
}
}
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
fixedThreadPool.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("delay 3 seconds");
}
}, 3, TimeUnit.SECONDS);
}
}
表示延迟3秒执行。
定期执行示例代码如下:
package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
}
}
表示延迟1秒后每3秒执行一次。
(4) newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
结果依次输出,相当于顺序执行各个任务。
你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:
工具目录:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe
运行程序做稍微修改:
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
public void run() {
try {
while(true) {
System.out.println(index);
Thread.sleep(10 * 1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
效果如下:
选择我们运行的程序:
监控运行状态
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java线程池
# java多线程池
# java中的线程池
# 一篇文章带你了解如何正确使用java线程池
# java多线程教程之如何使用线程池详解
# Java线程池中的各个参数如何合理设置
# Java中四种线程池的使用示例详解
# JAVA多线程的使用场景与注意事项总结
# java线程池不同场景下使用示例经验总结
# 定长
# 创建一个
# 第一个
# 会在
# 会用
# 若无
# 它只
# 单线程
# 你可以
# 第二个
# 分别为
# 自带
# 四种
# 大家多多
# 复用
# 运行状态
# 系统资源
# index
# static
# ExecutorService
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
动图在线制作网站有哪些,滑动动图图集怎么做?
网站建设保证美观性,需要考虑的几点问题!
微信小程序 input输入框控件详解及实例(多种示例)
Java垃圾回收器的方法和原理总结
如何在Windows 2008云服务器安全搭建网站?
phpredis提高消息队列的实时性方法(推荐)
实例解析angularjs的filter过滤器
浅谈Javascript中的Label语句
Laravel怎么实现模型属性的自动加密
魔毅自助建站系统:模板定制与SEO优化一键生成指南
如何在云主机上快速搭建多站点网站?
详解vue.js组件化开发实践
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何自定义建站之星模板颜色并下载新样式?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何快速搭建FTP站点实现文件共享?
如何在阿里云完成域名注册与建站?
EditPlus中的正则表达式 实战(1)
微信h5制作网站有哪些,免费微信H5页面制作工具?
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何在IIS中新建站点并配置端口与IP地址?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
香港服务器租用每月最低只需15元?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何生成URL和重定向?(路由助手函数)
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
制作企业网站建设方案,怎样建设一个公司网站?
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
googleplay官方入口在哪里_Google Play官方商店快速入口指南
如何在阿里云通过域名搭建网站?
香港服务器租用费用高吗?如何避免常见误区?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
Laravel如何配置Horizon来管理队列?(安装和使用)
Java遍历集合的三种方式
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
黑客入侵网站服务器的常见手法有哪些?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
BootStrap整体框架之基础布局组件
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
百度浏览器如何管理插件 百度浏览器插件管理方法
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
微信公众帐号开发教程之图文消息全攻略
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试

