首页 > 其他分享 >主要线程对比

主要线程对比

时间:2024-12-23 10:24:03浏览次数:2  
标签:场景 自定义 Executors 队列 任务 主要 线程 对比

Java 提供了多种线程池,主要通过 Executors 工具类和 ThreadPoolExecutor 自定义实现线程池。下面对常见的 5 种线程池类型 进行详细对比,最多使用的还是自定义线程池。

1. newCachedThreadPool(缓存线程池)

  • 特点
    • 线程数不固定,根据任务数量动态创建线程。
    • 空闲线程存活时间为 60 秒,超过时间会被回收。
    • 如果线程可用,复用现有线程;否则创建新线程。
  • 适用场景
    • 任务执行时间短,任务数量不确定的场景。
  • 风险
    • 线程数量无限制,任务过多时可能导致内存溢出(OOM)

示例

ExecutorService executor = Executors.newCachedThreadPool();

2. newFixedThreadPool(固定大小线程池)

  • 特点
    • 线程池的线程数是固定的,不会动态增加或减少。
    • 超出线程数的任务会进入阻塞队列等待执行。
    • 线程不会被回收,适合长期运行的任务。
  • 适用场景
    • 需要控制并发线程数,任务量较大且稳定的场景。
  • 风险
    • 队列过长可能导致任务堆积,影响响应速度。

示例

ExecutorService executor = Executors.newFixedThreadPool(10);

3. newSingleThreadExecutor(单线程线程池)

  • 特点
    • 线程池只有一个线程,所有任务按顺序执行(FIFO)。
    • 保证任务按顺序执行,线程异常时会创建新线程替代。
  • 适用场景
    • 需要保证任务顺序执行的场景。
    • 适用于单线程环境,避免多线程问题。
  • 风险
    • 任务过多会导致执行时间过长,影响性能。

示例

ExecutorService executor = Executors.newSingleThreadExecutor();

4. newScheduledThreadPool(定时任务线程池)

  • 特点
    • 线程池支持定时任务周期性任务执行。
    • 核心线程数固定,非核心线程会被回收。
  • 适用场景
    • 需要执行定时任务、周期任务的场景,如日志备份、定时调度等。
  • 风险
    • 如果任务执行时间超过周期时间,可能会导致任务堆积。

示例

ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);

// 定时执行任务
executor.schedule(() -> System.out.println("任务执行"), 5, TimeUnit.SECONDS);

// 周期性执行任务
executor.scheduleAtFixedRate(() -> System.out.println("周期任务"), 0, 10, TimeUnit.SECONDS);

5. newWorkStealingPool(工作窃取线程池,Java 8+)

  • 特点
    • 基于 ForkJoinPool 实现,使用并行处理任务,默认线程数为 CPU 核心数。
    • 每个线程维护一个任务队列,当其他线程空闲时,可以窃取任务执行。
  • 适用场景
    • 适合并行计算、任务较多且耗时不均匀的场景。
  • 风险
    • 需要考虑任务的并行度和性能,适用于任务拆分的情况。

示例

ExecutorService executor = Executors.newWorkStealingPool();

6. 自定义线程池(推荐)

  • 特点
    • 使用 ThreadPoolExecutor 可以自定义核心参数,提供更高灵活性控制力
  • 参数说明
    • corePoolSize:核心线程数。
    • maximumPoolSize:最大线程数。
    • keepAliveTime:空闲线程存活时间。
    • workQueue:任务队列。
    • threadFactory:线程工厂,设置线程名称。
    • handler:拒绝策略,任务无法执行时的处理方式。
  • 适用场景
    • 需要精确控制线程池行为的场景。

示例

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    5, 10, 60L, TimeUnit.SECONDS, 
    new LinkedBlockingQueue<>(100), 
    Executors.defaultThreadFactory(), 
    new ThreadPoolExecutor.AbortPolicy()
);

对比总结

线程池类型线程数任务队列适用场景风险
newCachedThreadPool 动态增长,无限制 无阻塞队列 短任务,任务数量不确定 线程过多,可能 OOM
newFixedThreadPool 固定线程数 阻塞队列 并发线程数固定,任务量大 队列任务堆积
newSingleThreadExecutor 1 个线程 阻塞队列 顺序执行任务 单任务过多影响性能
newScheduledThreadPool 核心线程数固定 延迟/周期任务 定时、周期性任务 执行时间超过周期导致堆积
newWorkStealingPool CPU 核心数 并行任务队列 并行计算、任务拆分 任务复杂度管理
自定义线程池 可自定义 可自定义 精确控制线程池行为 配置错误可能导致资源浪费

推荐使用场景

  1. 简单需求newFixedThreadPoolnewCachedThreadPool
  2. 顺序执行任务newSingleThreadExecutor
  3. 定时任务newScheduledThreadPool
  4. 并行计算newWorkStealingPool
  5. 复杂需求:推荐使用 自定义线程池,根据具体需求设置参数。

最佳实践

  • 避免使用 Executors 工厂方法:因为默认线程池容易引发风险(如线程数无限制)。
  • 推荐使用自定义线程池:通过 ThreadPoolExecutor 精确控制线程数量、队列大小和拒绝策略,确保系统稳定运行。
 

标签:场景,自定义,Executors,队列,任务,主要,线程,对比
From: https://www.cnblogs.com/shendidi/p/18623329

相关文章

  • 深入探讨 Java 的现代特性:从虚拟线程到模块化系统
    随着技术不断进步,Java也在不断演进,融入了许多新的特性和改进。作为目前世界上最流行的编程语言之一,Java在性能、并发、模块化和开发效率方面都作出了显著的提升。在这篇博客中,我们将探讨一些当前Java领域中比较流行的技术和特性,包括虚拟线程、模块系统、记录类(RecordClas......
  • java核心基础 第五章 线程
    核心概念计算机程序计算机程序是存储在硬盘上的一个文件,例如你经常用的浏览器Chrome,它在电脑硬盘上是一个chrome.exe的文件,你双击它就可以运行。这个文件里存储这个这个程序运行时需要的所有指令和数据。进程进程是一个计算机程序运行的容器,进程的概念是由操作系统提供的,一......
  • 多线程-锁-写锁(独占锁)/读锁(共享锁)
    一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。特点        可重入        读写分离无锁无序→加锁→读写锁演变classMyResource{Map<String,String>map=newHashMap<>();//=====ReentrantLock等价于=====s......
  • python多线程爬取药品信息
    多线程爬取药品信息利用多线程来获取药品信息可以实现高效的爬取,方便我们自己对药品的名称、价格以及功效进行了解和掌握导入需要使用到的包fromconcurrent.futures.threadimportThreadPoolExecutorfromlxmlimportetreeimportrequestsimportrandomimportcsv......
  • 在MyBatis中,`#{param}`和`${param}`是用于传递参数的两种不同方式,它们的主要区别在于
    1.**`#{param}`(预处理参数)**:  -`#{param}`是MyBatis中的参数占位符,它用于预处理(PreparedStatement)语句中的参数。  -当使用`#{param}`时,MyBatis会将参数值安全地传递给SQL语句,防止SQL注入攻击。  -`#{param}`会自动处理参数的转义,确保传入的值被正确处理,例如......
  • 线程池工作原理
    线程池综述它的主要特点为:线程复用;控制最大并发数;管理线程。使用线程池的好处有第一:降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁带来的资源消耗第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建好就可以立即执行。第三:提高线程的可管理性。线程是稀......
  • 千峰教育--Netty 再学习 1 网络模型概述(BIO、NIO、AIO)、BIO 逻辑实现及其局限性(单线程
    课程介绍1网络模型概述2Channel详解3Buffer详解4Selector详解5NIO综合案例-聊天室6AIO概念及实现 1网络编程IO模型介绍1.1BLockingIOBlockingIO也称BIO,及同步阻塞IO。Java的io包基于流模型实现,提供了FIle,FileInputStream,FileOutputStream等输入输出流......
  • 服务器杂谈 -- 有关国内外服务器的购买,以及特点与对比
    在我们将java等应用程序打包进行发布的时候,如果想让这个项目在外网可见,那么就需要买一台云服务器,将服务部署在云服务器上,方便进行外网访问。国内服务器的购买:那么,既然讲到云服务器的选购,大部分人都会想到阿里云。没错,笔者的第一个使用的服务器正是阿里云上的服务......
  • 【并发编程】第十一章 测试和调试多线程应用程序
    第十一章测试和调试多线程应用程序11.1与并发相关的bug类型有些类型的错误直接与并发的使用相关11.1.1不必要的阻塞线程因为等待某些条件(如互斥锁、条件变量、期值对象或I/O操作)而无法继续执行:死锁:两个或多个线程无限期地等待对方释放资源,导致程序挂起活锁:线程不断尝......
  • pyqt5线程龟兔赛跑
    哈哈哈#-*-coding:utf-8-*-#Formimplementationgeneratedfromreadinguifile'龟兔赛跑.ui'##Createdby:PyQt5UIcodegenerator5.15.9##WARNING:Anymanualchangesmadetothisfilewillbelostwhenpyuic5is#runagain.Donoteditt......