当前位置: 首页 > 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.dtcms.com/a/321765.html

相关文章:

  • 客户端攻击防御:详解现代浏览器安全措施
  • Python字典高阶操作:高效提取子集的技术与工程实践
  • Socket编程预习
  • js 实现洋葱模型、洋葱反向模型
  • 关于 Rust 异步(无栈协程)的相关疑问
  • Prometheus 监控平台部署与应用
  • 新版速递|ColchisFM突破传统建模局限,用地质统计学模拟构建更真实的地震正演模型
  • 1635. 预算够吗
  • linux运维命令查看cpu、内存、磁盘使用情况
  • FFmpeg 编译安装和静态安装
  • 12、GPIO介绍
  • Redis7集群搭建与原理分析
  • element plus table 表格操作列根据按钮数量自适应宽度
  • 从引导加载程序到sysfs:Linux设备树的完整解析与驱动绑定机制
  • 您与此网站之间建立的连接不安全
  • 智慧园区漏检率↓82%:陌讯多模态融合算法实战解析
  • 防御保护09
  • 【从0到1制作一块STM32开发板】6. PCB布线--信号部分
  • 手机拍照识别中模糊场景准确率↑37%:陌讯动态适配算法实战解析
  • 二、k8s 1.29 之 网络
  • OpenAI 的 GPT-5 来了
  • GO的启动流程(GMP模型/内存)
  • 要写新项目了,运行老Django项目找找记忆先
  • Redis(②-持久化)
  • 写一个redis客户端软件,参考 Another Redis Desktop Manager 的设计风格。
  • 【沉浸式解决问题】pycharm关闭科学模式
  • Docker Compose 实战指南:从配置到多容器联动的全流程解析
  • Linux系统编程Day9 -- 理解计算机的软硬件管理
  • Dijkstra?spfa?SPstra?
  • 01Vue3