为什么需要线程池?

发布时间:2026/6/30 2:40:23
为什么需要线程池? 线程池核心参数public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单位 BlockingQueueRunnable workQueue, // 任务队列 ThreadFactory threadFactory, // 线程工厂 RejectedExecutionHandler handler // 拒绝策略 )回到顶部三、线程池执行流程任务来了核心线程数未满 → 创建核心线程执行核心线程已满队列未满 → 任务加入队列队列已满线程数未达最大值 → 创建非核心线程执行线程数已达最大值 → 执行拒绝策略回到顶部四、4种拒绝策略AbortPolicy直接抛异常默认CallerRunsPolicy由调用线程执行任务DiscardPolicy直接丢弃不抛异常DiscardOldestPolicy丢弃队列中最老的任务回到顶部五、常见线程池// 固定大小线程池 ExecutorService fixedPool Executors.newFixedThreadPool(10); // 缓存线程池线程数无限适合短期异步任务 ExecutorService cachedPool Executors.newCachedThreadPool(); // 单线程线程池 ExecutorService singlePool Executors.newSingleThreadExecutor(); // 定时任务线程池 ScheduledExecutorService scheduledPool Executors.newScheduledThreadPool(5);回到顶部六、线程池最佳实践CPU密集型任务核心线程数 CPU核数 1IO密集型任务核心线程数 CPU核数 * 2// 推荐用法手动创建线程池 ThreadPoolExecutor executor new ThreadPoolExecutor( Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 2, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(1000), new ThreadFactoryBuilder().setNamePrefix(my-pool-).build(), new ThreadPoolExecutor.CallerRunsPolicy() );回到顶部七、线程池监控// 关键指标 executor.getActiveCount(); // 活跃线程数 executor.getQueue().size(); // 队列任务数 executor.getCompletedTaskCount(); // 已完成任务数 executor.getPoolSize(); // 当前线程数