线程池简介
什么是线程池
线程池(Thread Pool)是一种线程复用的技术,预先创建一定数量的线程放入池中,当有任务需要执行时,从池中获取空闲线程来执行任务,任务完成后线程不销毁,而是返回池中等待下一个任务。
1 2 3 4 5 6
| ExecutorService executor = Executors.newFixedThreadPool(5); executor.submit(() -> { System.out.println("任务执行中..."); }); executor.shutdown();
|
为什么需要线程池
问题:直接创建线程的弊端
1 2 3 4
| for (int i = 0; i < 1000; i++) { new Thread(() -> doTask()).start(); }
|
| 问题 |
说明 |
| 创建开销大 |
线程创建需要分配栈内存(默认1MB)、初始化 TCB 等 |
| 销毁开销大 |
线程销毁需要回收资源、GC 处理 |
| 资源耗尽 |
无限制创建线程可能导致 OOM 或系统崩溃 |
| 上下文切换 |
线程过多导致 CPU 频繁切换,性能下降 |
| 难以管理 |
无法统一监控、调度、限流 |
解决:线程池的优势
1 2 3 4 5
| ExecutorService executor = Executors.newFixedThreadPool(10); for (int i = 0; i < 1000; i++) { executor.submit(() -> doTask()); }
|
线程池的核心优势
| 优势 |
说明 |
| 降低资源消耗 |
复用线程,避免频繁创建销毁的开销 |
| 提高响应速度 |
任务到达时无需等待线程创建,直接执行 |
| 提高可管理性 |
统一分配、调优、监控线程资源 |
| 提供更多功能 |
定时执行、周期执行、任务队列、拒绝策略等 |
线程池核心接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| ┌─────────────────────────────────────────────────────────┐ │ Executor │ │ (顶层接口) │ │ void execute(Runnable) │ └─────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ ExecutorService │ │ (扩展生命周期管理) │ │ submit() / shutdown() / invokeAll() / ... │ └─────────────────────┬───────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ ThreadPoolExecutor │ │ (核心实现类) │ │ 7大参数 / 4种拒绝策略 / 5种状态 │ └─────────────────────────────────────────────────────────┘
|
快速入门示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import java.util.concurrent.*;
public class ThreadPoolDemo { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(3); for (int i = 1; i <= 5; i++) { final int taskId = i; executor.submit(() -> { System.out.println("任务" + taskId + " 由 " + Thread.currentThread().getName() + " 执行"); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); } executor.shutdown(); } }
|
输出示例:
1 2 3 4 5
| 任务1 由 pool-1-thread-1 执行 任务2 由 pool-1-thread-2 执行 任务3 由 pool-1-thread-3 执行 任务4 由 pool-1-thread-1 执行 ← 线程复用 任务5 由 pool-1-thread-2 执行 ← 线程复用
|
相关链接
- 下一篇:02-线程池原理
- 线程池类型:03-线程池类型