题目
使用固定大小线程池执行多线程任务
信息
- 类型:问答
- 难度:⭐
考点
线程池创建,任务提交,线程池关闭
快速回答
使用固定大小线程池执行多线程任务的步骤如下:
- 通过
Executors.newFixedThreadPool()创建线程池 - 使用
execute()方法提交Runnable任务 - 任务执行完成后调用
shutdown()关闭线程池
原理说明
线程池通过复用线程减少创建/销毁开销。固定大小线程池(FixedThreadPool)特点:
- 核心线程数=最大线程数(固定数量)
- 使用无界队列
LinkedBlockingQueue - 适用于已知并发量的稳定负载场景
代码示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
// 1. 创建固定大小为3的线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
// 2. 提交5个任务
for (int i = 1; i <= 5; i++) {
final int taskId = i;
executor.execute(() -> {
System.out.println("任务" + taskId + " 由线程 " + Thread.currentThread().getName() + " 执行");
});
}
// 3. 关闭线程池(非强制,等待任务完成)
executor.shutdown();
}
}最佳实践
- 根据CPU核心数设置线程池大小(通常N+1,N为CPU核心数)
- 使用
shutdown()平滑关闭而非shutdownNow()(除非需立即中断) - 用
ThreadFactory自定义线程名称便于监控
常见错误
- 忘记关闭线程池 → 导致JVM无法退出(资源泄漏)
- 误用无界队列 → 大量任务堆积导致OOM(可用
ThreadPoolExecutor自定义队列) - 捕获任务异常 → 需在任务内处理异常否则会丢失
扩展知识
- 其他线程池类型:
-newCachedThreadPool()(弹性扩容)
-newSingleThreadExecutor()(单线程顺序执行) - 任务提交方式:
-execute():提交无返回值的Runnable
-submit():可提交Callable获取Future结果 - 关闭验证:
用awaitTermination(60, TimeUnit.SECONDS)等待线程池关闭