java如何实现线程池
Java线程池的实现方法
Java通过java.util.concurrent包提供了线程池的实现框架,核心类是ThreadPoolExecutor。以下是实现线程池的典型方式:
使用Executors工厂类创建
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
newFixedThreadPool创建固定大小的线程池,newCachedThreadPool创建可扩容线程池,newSingleThreadExecutor创建单线程池。
自定义ThreadPoolExecutor
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(100) // 工作队列
);
参数依次为:核心线程数、最大线程数、线程空闲时间、时间单位、任务队列。
提交任务到线程池
executor.execute(() -> {
// 执行任务代码
});
Future<String> future = executor.submit(() -> {
return "task result";
});
execute()用于提交无返回值的任务,submit()用于提交有返回值的任务。
关闭线程池
executor.shutdown(); // 平缓关闭
executor.shutdownNow(); // 立即关闭
List<Runnable> unfinishedTasks = executor.shutdownNow();
shutdown()会等待已提交任务完成,shutdownNow()会尝试中断正在执行的任务。
线程池配置建议
核心线程数通常设置为CPU核心数+1 最大线程数根据任务类型调整:CPU密集型任务建议核心数+1,IO密集型任务可设置更高 任务队列容量需要平衡内存消耗和系统负载 合理设置拒绝策略(默认抛出RejectedExecutionException)
拒绝策略实现
当队列满且线程数达到最大值时,可以自定义拒绝策略:

ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, 10, 60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
内置策略包括:AbortPolicy(默认)、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。






