当前位置: 首页 > news >正文

浅析线程池工具类Executors

介绍

Executors 是 Java 中的一个工具类,它位于 java.util.concurrent 包中,提供了几种便捷的方法来创建和管理线程池。它的主要目的是简化线程池的使用,尤其是在不需要特别细致配置的情况下。

尽管 Executors 提供了简单的接口来创建线程池,但它的默认配置并不总是适用于所有场景,特别是在高并发、负载变化较大的情况下,可能会导致性能问题。


Executors提供的方法

1. newFixedThreadPool(int nThreads) 无限队列

  • 描述:创建一个固定大小的线程池,线程池中有固定的 nThreads 个线程。
  • 特点:所有线程始终处于空闲或工作状态。任务会被提交到队列中,当所有线程都在工作时,新任务会排队等待。
  • 适用场景:适用于任务数量固定的情况,且每个任务都需要一个独立的线程来处理。
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
}

2. newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 无限队列

  • 描述:创建一个固定大小的线程池,并使用指定的 ThreadFactory 来创建新线程。
  • 特点:与 newFixedThreadPool 相同,但可以自定义线程的创建方式(例如设置线程名称、优先级等)。
  • 适用场景:需要自定义线程属性的场景,例如设置线程名称、优先级、Daemon 线程等。
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory);}

3. newWorkStealingPool(int parallelism)

  • 描述:创建一个支持工作窃取(work-stealing)算法的线程池。线程池中最大线程数由 parallelism 参数指定。
  • 特点:适用于高并发任务,能够动态调整线程数,采用工作窃取机制以提高并发性能。
  • 适用场景:适用于 CPU 密集型任务,尤其是那些独立并且相互不依赖的任务。
public static ExecutorService newWorkStealingPool(int parallelism) {return new ForkJoinPool(parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
}

4. newWorkStealingPool()

  • 描述:创建一个工作窃取线程池,默认的 parallelism 设置为系统可用的处理器数。
  • 特点:根据系统的处理器数动态调整线程池大小。
  • 适用场景:适用于并行度依赖于 CPU 核心数的任务。
public static ExecutorService newWorkStealingPool() {return new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);
}

5. newSingleThreadExecutor() 无限队列

  • 描述:创建一个只有单个工作线程的线程池,任务会按顺序执行。
  • 特点:所有任务按顺序执行,一个接一个,适用于任务之间有顺序依赖的场景。
  • 适用场景:适用于顺序执行的任务,如日志处理、文件系统操作等。
public static ExecutorService newSingleThreadExecutor() {return newSingleThreadExecutor(defaultThreadFactory());
}

6. newSingleThreadExecutor(ThreadFactory threadFactory) 无限队列

  • 描述:创建一个单线程的线程池,并使用指定的 ThreadFactory 来创建线程。
  • 特点:与 newSingleThreadExecutor 相同,但可以自定义线程的创建方式。
  • 适用场景:需要自定义单线程池中线程的属性的场景。
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {return new AutoShutdownDelegatedExecutorService(new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory));
}

7. newCachedThreadPool() 无限线程

  • 描述:创建一个可缓存的线程池,线程池中的线程数会动态变化。
  • 特点:如果有空闲线程,新的任务会复用这些线程;如果没有空闲线程,则会创建新线程。空闲线程会在 60 秒后被回收。
  • 适用场景:适用于任务执行时间较短、数量变化较大的场景。
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
}

8. newCachedThreadPool(ThreadFactory threadFactory) 无限线程

  • 描述:创建一个可缓存的线程池,使用指定的 ThreadFactory 来创建线程。
  • 特点:与 newCachedThreadPool 相同,但可以自定义线程的创建方式。
  • 适用场景:需要自定义线程池中线程属性的场景。
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) {return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), threadFactory);
}

9. newThreadPerTaskExecutor(ThreadFactory threadFactory)

  • 描述:为每个任务创建一个新的线程,线程数没有上限。
  • 特点:每个任务都会创建一个新线程,适用于执行单独的、短时间任务。
  • 适用场景:适用于每个任务需要独立线程的场景,但如果任务数过多,可能会消耗大量系统资源。
public static ExecutorService newThreadPerTaskExecutor(ThreadFactory threadFactory) {return ThreadPerTaskExecutor.create(threadFactory);
}

10. newVirtualThreadPerTaskExecutor() 虚拟线程

  • 描述:为每个任务创建一个新的虚拟线程。虚拟线程是 Java 19 引入的一种轻量级线程,适合处理大量短生命周期的任务。
  • 特点:线程的创建和销毁开销较小,适合高并发的轻量任务。
  • 适用场景:适用于大量并发的 I/O 密集型任务。
public static ExecutorService newVirtualThreadPerTaskExecutor() {ThreadFactory factory = Thread.ofVirtual().factory();return newThreadPerTaskExecutor(factory);
}

11. newSingleThreadScheduledExecutor()

  • 描述:创建一个单线程的调度线程池,用于调度延迟执行或定期执行的任务。
  • 特点:任务会按顺序执行,且保证任务是按顺序延迟或定期执行的。
  • 适用场景:适用于需要定时执行的单线程任务,如定时任务调度。
public static ScheduledExecutorService newSingleThreadScheduledExecutor() {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1));
}

12. newSingleThreadScheduledExecutor(ThreadFactory threadFactory)

  • 描述:创建一个单线程的调度线程池,并使用指定的 ThreadFactory 创建线程。
  • 特点:与 newSingleThreadScheduledExecutor 相同,但可以自定义线程的创建方式。
  • 适用场景:需要自定义调度线程的场景。
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {return new DelegatedScheduledExecutorService(new ScheduledThreadPoolExecutor(1, threadFactory));
}

13. newScheduledThreadPool(int corePoolSize)

  • 描述:创建一个可以定期或延迟执行任务的线程池,线程池的大小由 corePoolSize 决定。
  • 特点:可以调度任务执行延迟或周期性任务。线程池的大小是 corePoolSize,即使线程空闲也会保持这些线程。
  • 适用场景:适用于周期性任务或定时任务的调度。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);
}

14. newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

  • 描述:创建一个带有自定义线程工厂的定时任务线程池。
  • 特点:与 newScheduledThreadPool(int corePoolSize) 相同,但使用指定的 ThreadFactory 创建线程。
  • 适用场景:需要自定义调度线程的场景。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory) {return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}

总结

  • 固定线程池 (newFixedThreadPool):适合处理任务量固定且每个任务需要独立线程的场景。
  • 可缓存线程池 (newCachedThreadPool):适合处理短时间的、高并发的任务,尤其是任务数不确定的场景。
  • 单线程池 (newSingleThreadExecutor):适合处理顺序执行的任务。
  • 工作窃取线程池 (newWorkStealingPool):适合处理大量 CPU 密集型并行任务。
  • 定时任务线程池 (newScheduledThreadPool):适合处理定时任务或周期性任务。
http://www.lryc.cn/news/614190.html

相关文章:

  • ASTM D4169-23版本有哪些实施指南
  • 2025年最新Java后端场景题+八股文合集(100w字面试题总结)
  • [激光原理与应用-176]:测量仪器 - 频谱型 - AI分类与检测相对于传统算法的优缺点分析
  • 零知开源——基于STM32F103RBT6的TDS水质监测仪数据校准和ST7789显示实战教程
  • 【优选算法】BFS解决拓扑排序
  • Rust语言序列化和反序列化vec<u8>,serde库Serialize, Deserialize,bincode库(2025年最新解决方案详细使用)
  • 全面了解svm
  • 海量数据处理问题详解
  • MySQL 正则表达式详细说明
  • [ MySQL 数据库 ] 环境安装配置和使用
  • 零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南
  • IPC总结
  • 【接口自动化测试】
  • FastAPI的BackgroundTasks如何玩转生产者-消费者模式?
  • 关于 Rust 异步底层实现中 waker 的猜测
  • #C语言——刷题攻略:牛客编程入门训练(六):运算(三)-- 涉及 辗转相除法求最大公约数
  • GPT OSS 双模型上线,百度百舸全面支持快速部署
  • 创建MyBatis-Plus版的后端查询项目
  • SQL Server 2019搭建AlwaysOn高可用集群
  • 模块 PCB 技术在未来通信领域的创新突破方向
  • Cisco 2018-2023年度互联网报告深度解析:数字化转型时代的网络发展趋势与战略洞察
  • kafka 为什么需要分区?分区的引入带来了哪些好处
  • SpringMVC(四)
  • 前后端日期交互方案|前端要传时间戳还是字符串?后端接收时是用Long还是Date还是String?
  • 机器学习 SVM支持向量机
  • 虚幻基础:场景actor与角色的碰撞
  • (0️⃣基础)程序控制语句(初学者)(第3天)
  • Javase-异常
  • Idea配置——build system的选项区别
  • SpringBoot激活指定profile的方式