侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用固定大小线程池执行多线程任务

2025-12-13 / 0 评论 / 4 阅读

题目

使用固定大小线程池执行多线程任务

信息

  • 类型:问答
  • 难度:⭐

考点

线程池创建,任务提交,线程池关闭

快速回答

使用固定大小线程池执行多线程任务的步骤如下:

  1. 通过Executors.newFixedThreadPool()创建线程池
  2. 使用execute()方法提交Runnable任务
  3. 任务执行完成后调用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)等待线程池关闭