线程池:初始化、创建线程、执行任务三个阶段分开说

📅 2026/7/16 1:49:37
线程池:初始化、创建线程、执行任务三个阶段分开说
目录1. 线程池对象什么时候创建实例化2. 线程什么时候真正启动创建工作线程情况 1默认allowCoreThreadTimeOutfalse常规配置情况 2提前预创建核心线程3. 任务什么时候执行一句话总结补充示例1. 线程池对象什么时候创建实例化调用new ThreadPoolExecutor(...)/Executors.newFixedThreadPool()这行代码时只是创建线程池对象不会创建任何工作线程。 此时队列、核心参数都初始化完毕但池子里线程数量 0。2. 线程什么时候真正启动创建工作线程分两种情况情况 1默认allowCoreThreadTimeOutfalse常规配置第一次提交任务时才会创建第一个核心线程并启动继续提交任务直到线程数达到corePoolSize核心线程数再来任务 → 放进阻塞队列队列满了 → 创建非核心线程直到maximumPoolSize线程数到最大且队列满 → 触发拒绝策略。结论不提交任务池子里一条线程都不会启动。情况 2提前预创建核心线程线程池提供两个方法可以不用等任务直接启动核心线程java// 预创建所有核心线程 pool.prestartAllCoreThreads(); // 预创建1条核心线程 pool.prestartCoreThread();调用这两个方法后即使没有任务线程也会启动并阻塞等待队列任务。3. 任务什么时候执行调用execute()/submit()提交任务时若已有空闲线程立刻分配执行无空闲核心线程新建线程执行 / 入队 / 拒绝。一句话总结定义new ThreadPoolExecutor只是构建池对象不启动线程不手动预启动核心线程第一次使用提交任务时才创建并启动线程调用prestartAllCoreThreads()实例化后就能提前启动全部核心线程无需等待任务。补充示例java// 1. 仅创建对象无线程运行 ThreadPoolExecutor pool new ThreadPoolExecutor(2, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(10)); // 2. 方式A提交任务才启动线程最常用 pool.execute(() - System.out.println(任务)); // 2. 方式B提前启动所有核心线程无任务也有2条线程阻塞等待 pool.prestartAllCoreThreads();