选型 ExecutorService 的核心思路是:先明确任务特征(CPU 型 / IO 型 / 混合型、任务数量、是否有返回结果、是否允许排队、是否要求低延迟),再选择合适的线程池类型和参数。下面给你一个从选型到示例的完整指南。
Executors.newFixedThreadPool适合:
ExecutorService executor = Executors.newFixedThreadPool(4);
✅ 特点:
LinkedBlockingQueue)⚠️ 注意:
✅ 最常用、最稳妥
Executors.newCachedThreadPool适合:
ExecutorService executor = Executors.newCachedThreadPool();
✅ 特点:
Integer.MAX_VALUE)❌ 风险:
✅ 适合:轻量、短时任务
Executors.newSingleThreadExecutor适合:
ExecutorService executor = Executors.newSingleThreadExecutor();
✅ 特点:
✅ 常见场景:
Executors.newScheduledThreadPool适合:
ScheduledExecutorService executor =
Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(
() -> System.out.println("run"),
0, 1, TimeUnit.SECONDS
);
✅ 替代 Timer(更安全)
ThreadPoolExecutor 手动创建 ✅生产环境强烈推荐
ExecutorService executor = new ThreadPoolExecutor(
4, // corePoolSize
8, // maximumPoolSize
60L, TimeUnit.SECONDS, // keepAliveTime
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
| 参数 | 作用 |
|---|---|
| corePoolSize | 常驻线程数 |
| maximumPoolSize | 最大线程数 |
| keepAliveTime | 多余线程存活时间 |
| workQueue | 任务队列 |
| RejectedExecutionHandler | 拒绝策略 |
线程数 ≈ CPU 核心数 或 +1
int n = Runtime.getRuntime().availableProcessors();
ExecutorService executor =
Executors.newFixedThreadPool(n);
线程数可以远大于 CPU 核心数
经验公式:
线程数 ≈ CPU核心数 * 2 或更多
或:
new ThreadPoolExecutor(
16, 32, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(200)
);
| 策略 | 说明 |
|---|---|
| AbortPolicy | 抛异常(默认) |
| CallerRunsPolicy | 由调用线程执行(推荐) |
| DiscardPolicy | 直接丢弃 |
| DiscardOldestPolicy | 丢弃最老任务 |
✅ 生产环境常用:
new ThreadPoolExecutor.CallerRunsPolicy()
❌ 无脑用 Executors.newCachedThreadPool()
❌ 不关闭线程池
❌ 一个线程池干所有事
❌ 队列无界 + 高并发
简单场景用 Executors,生产环境用 ThreadPoolExecutor;CPU 型少线程,IO 型多线程,队列要有界,拒绝策略要明确。
如果你愿意,可以告诉我:
我可以直接帮你给出可用的线程池参数配置。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。