核心概念总结
1. Executors 工厂类
• 作用:快速创建标准线程池。 • 关键方法: • newFixedThreadPool(n):固定大小线程池。 • newCachedThreadPool():弹性线程池(适合短任务)。 • newSingleThreadExecutor():单线程顺序执行。 • 示例:
java
ExecutorService executor = Executors.newFixedThreadPool(10);2. ExecutorService 接口
• 作用:管理线程池生命周期和任务提交。 • 核心功能: • submit(task):提交任务并返回 Future。 • shutdown():优雅关闭线程池。 • awaitTermination():等待任务完成。 • 示例:
java
executor.submit(() -> processData());
executor.shutdown();3. newFixedThreadPool 方法
• 作用:创建固定线程数的线程池。 • 特点: • 严格限制并发数,避免资源耗尽。 • 任务队列无界(需注意内存溢出风险)。 • 适用场景:稳定负载的批量任务处理。
4. CompletableFuture 异步工具
• 作用:链式编排异步任务,支持非阻塞操作。 • 核心功能: • supplyAsync() / runAsync():启动异步任务。 • thenApply() / thenAccept():链式处理结果。 • allOf() / anyOf():组合多个任务。 • 与线程池协作:
java
ExecutorService pool = Executors.newFixedThreadPool(3);
CompletableFuture.supplyAsync(() -> fetchData(), pool)
.thenApplyAsync(data -> process(data), pool);关键区别与协作
| 组件 | 角色 | 典型使用场景 |
|---|---|---|
Executors | 线程池工厂 | 快速创建标准线程池配置 |
newFixedThreadPool | 创建固定线程池的方法 | 限制并发数,防止系统过载 |
ExecutorService | 线程池操作接口 | 提交任务、关闭线程池、监控状态 |
CompletableFuture | 异步任务编排工具 | 复杂任务链、并行处理、结果组合 |
协作流程
- 创建线程池:通过
Executors.newFixedThreadPool(10)生成线程池。 - 提交任务:使用
ExecutorService.submit()或CompletableFuture提交任务。 - 异步编排:通过
CompletableFuture组合多个任务(指定自定义线程池)。 - 资源释放:调用
shutdown()关闭线程池。
最佳实践
- 线程池选择: • CPU 密集型:固定线程池(线程数 ≈ CPU 核数)。 • I/O 密集型:弹性线程池(如
newCachedThreadPool)。 - 资源释放:java
executor.shutdown(); // 先尝试优雅关闭 if (!executor.awaitTermination(60, SECONDS)) { executor.shutdownNow(); // 超时强制关闭 } - 异常处理:java
CompletableFuture.supplyAsync(() -> task()) .exceptionally(ex -> handleError(ex));
常见误区
• 误区1:CompletableFuture 必须用默认线程池。
纠正:可通过 ExecutorService 指定自定义线程池。
• 误区2:线程池越大越好。
纠正:过大的线程池会导致上下文切换开销,需根据任务类型调整。
总结
• Executors:你的“线程池工厂”,一键生成所需配置。 • ExecutorService:线程池的“遥控器”,控制任务执行和关闭。 • CompletableFuture:任务编排的“瑞士军刀”,简化异步代码。 • 协作关系:工厂造池 → 接口管池 → 异步工具用池。