365bet游戏开户-约彩365官旧版本网客户端下载-365双试投注

Est. 1980 · 每日复古新闻

Java 并发库中提供了哪些线程池实现?它们有什么区别?

Java 并发库中提供了哪些线程池实现?它们有什么区别?

Java 并发库通过 java.util.concurrent.Executors 工厂类提供了多种线程池实现。以下是主要的线程池类型及其区别,并附代码示例:

🧵 1. FixedThreadPool(固定大小线程池)

特点:核心线程数 = 最大线程数,使用无界队列 LinkedBlockingQueue使用场景:已知并发量、需要限制资源使用的场景注意:任务过多可能导致内存溢出

ExecutorService fixedPool = Executors.newFixedThreadPool(3); // 固定3个线程

// 提交任务

IntStream.range(0, 5).forEach(i ->

fixedPool.execute(() -> {

System.out.println(Thread.currentThread().getName() + " 处理任务-" + i);

try { Thread.sleep(1000); } catch (InterruptedException e) {}

})

);

fixedPool.shutdown(); // 关闭线程池

⚡ 2. CachedThreadPool(缓存线程池)

特点:无核心线程,最大线程数=Integer.MAX_VALUE,使用同步队列 SynchronousQueue使用场景:大量短期异步任务注意:可能创建大量线程导致资源耗尽

ExecutorService cachedPool = Executors.newCachedThreadPool();

IntStream.range(0, 100).forEach(i ->

cachedPool.execute(() ->

System.out.println(Thread.currentThread().getName() + " 快速任务-" + i)

)

);

cachedPool.shutdown();

→ 3. SingleThreadExecutor(单线程池)

特点:仅1个工作线程,使用无界队列使用场景:需要保证任务顺序执行的场景

ExecutorService singlePool = Executors.newSingleThreadExecutor();

IntStream.range(0, 5).forEach(i ->

singlePool.execute(() ->

System.out.println("顺序执行任务-" + i)

)

);

singlePool.shutdown();

⏰ 4. ScheduledThreadPool(定时线程池)

特点:支持定时/周期性任务,使用 DelayedWorkQueue使用场景:定时任务、心跳检测等

ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(2);

// 延迟1秒执行

scheduledPool.schedule(() ->

System.out.println("延迟任务"), 1, TimeUnit.SECONDS

);

// 固定频率执行(首次延迟2秒,后续每3秒执行)

scheduledPool.scheduleAtFixedRate(() ->

System.out.println("周期性任务"), 2, 3, TimeUnit.SECONDS

);

// scheduledPool.shutdown(); // 实际使用需关闭

🧩 5. WorkStealingPool(工作窃取线程池)- Java 8+

特点:基于ForkJoinPool实现,使用工作窃取算法使用场景:并行计算、分治任务

ExecutorService workStealingPool = Executors.newWorkStealingPool();

// 提交可分解的任务(如斐波那契计算)

workStealingPool.submit(() -> {

System.out.println("WorkStealing任务: " +

ForkJoinPool.commonPool().getPoolSize());

});

workStealingPool.shutdown();

📊 线程池对比表

线程池类型核心线程数最大线程数队列类型适用场景FixedThreadPool自定义(n)等于核心线程数LinkedBlockingQueue控制资源使用的并发任务CachedThreadPool0Integer.MAX_VALUESynchronousQueue大量短期异步任务SingleThreadPool11LinkedBlockingQueue单线程顺序执行任务ScheduledThreadPool自定义(n)Integer.MAX_VALUEDelayedWorkQueue定时/周期性任务WorkStealingPoolCPU核心数无上限任务窃取队列并行计算/分治任务

🚨 重要注意事项

推荐使用 ThreadPoolExecutor 手动创建线程池,避免使用无界队列(可能引起OOM):

new ThreadPoolExecutor(

5, // corePoolSize

10, // maximumPoolSize

60L, TimeUnit.SECONDS, // keepAliveTime

new ArrayBlockingQueue<>(100) // 有界队列

);

使用 ScheduledThreadPool 替代 Timer所有线程池最终都应调用 shutdown() 释放资源使用 Future 处理带返回值的任务:

Future future = threadPool.submit(() -> "结果");

System.out.println(future.get()); // 阻塞获取结果

💡 最佳实践:根据任务特性选择线程池类型,生产环境建议手动配置线程池参数,并设置拒绝策略(如 RejectedExecutionHandler)保证系统稳定性。

相关文章