在微服务架构下,多线程编程已经成为Java开发者的必备技能。本文将帮助你掌握多线程开发的核心知识,避开常见陷阱。
一、为什么要深入理解多线程?
1.1 现实问题
- 接口响应慢
- CPU利用率低
- 内存泄漏频发
- 死锁难以排查
- 并发BUG难复现
1.2 业务场景
- 批量数据处理
- 并行任务执行
- 异步消息处理
- 定时任务调度
- 实时数据计算
二、线程池的正确使用
2.1 常见错误示例
// ❌ 错误示例:直接使用Executors创建线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
// ❌ 错误示例:没有明确的拒绝策略
ThreadPoolExecutor executor = new ThreadPoolExecutor(
10, 10, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>()
);
2.2 最佳实践
// ✅ 推荐示例:自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new LinkedBlockingQueue<>(100), // 有界队列
new ThreadFactoryBuilder()
.setNameFormat("业务名称-thread-%d")
.build(), // 自定义线程工厂
new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);
// 优雅关闭线程池
void shutdownThreadPool(ThreadPoolExecutor executor) {
executor.shutdown();
try {
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException e) {
executor.shutdownNow();
}
}
三、并发集合实战
3.1 Map的线程安全
// ❌ 错误示例:在并发环境下使用HashMap
Map<String, Object> map = new HashMap<>();
标签:Java,示例,避坑,线程,executor,new,多线程,ThreadPoolExecutor
From: https://blog.csdn.net/weixin_44297859/article/details/144810410