0

0

Java常用并发类库与ExecutorService

P粉602998670

P粉602998670

发布时间:2026-01-05 13:39:21

|

464人浏览过

|

来源于php中文网

原创

ExecutorService 是统一调度任务的接口,封装线程复用、队列缓冲、拒绝策略与优雅关闭能力;相比 new Thread() 可避免资源失控与 OOM 风险。

java常用并发类库与executorservice

ExecutorService 是什么,为什么不用 new Thread()

它不是线程池的“实现类”,而是统一调度任务的接口。直接 new Thread() 启动线程会导致资源失控:线程创建销毁开销大、无复用、无统一生命周期管理、OOM 风险高。而 ExecutorService 封装了线程复用、队列缓冲、拒绝策略、优雅关闭等关键能力。

实际开发中,几乎不手动实现 ExecutorService,而是通过 Executors 工具类获取标准实现:

ExecutorService pool = Executors.newFixedThreadPool(4);
ExecutorService pool = Executors.newCachedThreadPool();
ExecutorService pool = Executors.newSingleThreadExecutor();

但要注意:Executors 创建的几种默认池在生产环境有隐患——比如 newCachedThreadPool() 使用无界 SynchronousQueue,任务爆发时会无限创建线程;newFixedThreadPool() 的任务队列是无界 LinkedBlockingQueue,可能撑爆堆内存。所以更推荐显式构造 ThreadPoolExecutor

如何安全地创建和关闭 ThreadPoolExecutor

显式构造能控制核心参数:核心线程数、最大线程数、空闲线程存活时间、任务队列、拒绝策略。这是避免线上事故的关键一步。

立即学习Java免费学习笔记(深入)”;

常见错误包括:用 shutdownNow() 强制中断正在执行的任务(可能破坏数据一致性)、忘记调用 awaitTermination() 导致 JVM 提前退出、或在 finally 块外关闭导致资源泄漏。

瑞宝通JAVA版B2B电子商务系统
瑞宝通JAVA版B2B电子商务系统

瑞宝通B2B系统使用当前流行的JAVA语言开发,以MySQL为数据库,采用B/S J2EE架构。融入了模型化、模板、缓存、AJAX、SEO等前沿技术。与同类产品相比,系统功能更加强大、使用更加简单、运行更加稳 定、安全性更强,效率更高,用户体验更好。系统开源发布,便于二次开发、功能整合、个性修改。 由于使用了JAVA开发语言,无论是在Linux/Unix,还是在Windows服务器上,均能良好运行

下载
  • shutdown():停止接收新任务,已提交任务继续执行
  • shutdownNow():尝试中断所有运行中线程,并返回未执行的任务列表
  • 必须配合 awaitTermination(long, TimeUnit) 等待终止完成,超时后应做日志或兜底处理
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    2, 4,
    60L, TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(100),
    new ThreadPoolExecutor.CallerRunsPolicy()
);
// ... 提交任务
executor.shutdown();
try {
    if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
        executor.shutdownNow();
    }
} catch (InterruptedException e) {
    executor.shutdownNow();
    Thread.currentThread().interrupt();
}

submit() 和 execute() 的区别在哪

两者都用于提交任务,但语义和用途完全不同:

  • execute(Runnable):仅执行,无返回值,不支持异常捕获,适用于“发完就不管”的场景
  • submit(Runnable)submit(Callable):返回 Future,可主动获取结果、判断是否完成、取消任务、捕获执行异常

典型陷阱:用 submit(Runnable) 后不调用 get(),导致任务内抛出的异常被吞掉(FutureTask 内部只在 get() 时重抛);或者在循环中反复 submit().get(),造成串行阻塞,失去并发意义。

Future future = executor.submit(() -> {
    // 可能抛异常
    return "done";
});
// 必须 get() 才能看到异常
try {
    String result = future.get(); // 阻塞直到完成
} catch (ExecutionException e) {
    Throwable cause = e.getCause(); // 真实异常在这里
}

CompletableFuture 与 ExecutorService 怎么配合用

CompletableFuture 默认使用 ForkJoinPool.commonPool(),但 IO 密集型任务(如 HTTP 调用、DB 查询)不该挤占这个 CPU 密集型线程池。正确做法是显式传入自定义 ExecutorService

容易忽略的点:异步链式调用中,每个 thenApplyAsyncthenComposeAsync 都可以指定不同线程池;若不指定,会继续用上一个阶段的线程池,可能导致 IO 任务卡住 CPU 密集型计算。

  • IO 类型任务:用专为 IO 优化的线程池(如核心数 × 2~4,带较大队列)
  • CPU 密集型任务:线程数 ≈ CPU 核心数,避免上下文切换开销
  • 不要混用:避免把 DB 查询和图像压缩放在同一个池里
ExecutorService ioPool = Executors.newFixedThreadPool(8);
CompletableFuture.supplyAsync(() -> fetchFromDatabase(), ioPool)
    .thenApplyAsync(data -> processInMemory(data), 
                    ForkJoinPool.commonPool());

线程池命名、监控、拒绝策略日志这些细节,在压测和上线后才真正暴露价值。别等告警响了才想起没给 ThreadFactory 设置名称。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

827

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

732

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

732

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16924

2023.08.03

C++ 高性能计算与并行编程
C++ 高性能计算与并行编程

本专题专注于 C++ 在高性能计算(HPC)与并行编程中的应用,涵盖多线程、并发数据处理、OpenMP、MPI、GPU加速等技术。通过实际案例,帮助开发者掌握 如何利用 C++ 进行大规模数据计算和并行处理,提高程序的执行效率,适应高性能计算与数据密集型应用场景。

4

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.3万人学习

C# 教程
C# 教程

共94课时 | 6.2万人学习

Java 教程
Java 教程

共578课时 | 43.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号