首页 > 其他分享 >创建线程池有哪几种方式

创建线程池有哪几种方式

时间:2024-11-12 11:45:53浏览次数:1  
标签:场景 创建 池有 适用 任务 哪几种 线程 定时

 

 

Java中常见创建线程池的几种方法。

1. 使用 ​​Executors​​ 工具类创建线程池

​newFixedThreadPool(int nThreads)​
  • 特点:创建一个固定大小的线程池,线程池中的线程数始终保持不变。
  • 适用场景:适用于任务量已知且相对固定的场景,可以有效控制资源的使用。
​newSingleThreadExecutor()​
  • 特点:创建一个单线程的线程池,所有任务按顺序执行,一次只有一个任务处于活动状态。
  • 适用场景:适用于需要按顺序执行任务的场景,确保任务的顺序性和互斥性。
​newCachedThreadPool()​
  • 特点:创建一个可缓存的线程池,线程池会根据需要创建新线程,但在先前构建的线程可用时将重用它们。空闲线程会在60秒后被终止。
  • 适用场景:适用于执行大量短期异步任务的场景,可以快速响应和处理任务。
​newScheduledThreadPool(int corePoolSize)​
  • 特点:创建一个固定大小的线程池,可以延迟或周期性地执行任务。
  • 适用场景:适用于需要定时或周期性执行任务的场景,如定时任务调度。
​newSingleThreadScheduledExecutor()​
  • 特点:创建一个单线程的线程池,可以延迟或周期性地执行任务。
  • 适用场景:适用于需要按顺序执行定时任务的场景,确保任务的顺序性和互斥性。
​newWorkStealingPool(int parallelism)​
  • 特点:创建一个工作窃取线程池,使用 ​​ForkJoinPool​​ 实现,支持并行处理任务。线程池中的线程会尝试“窃取”其他线程的任务来执行。
  • 适用场景:适用于需要并行处理大量任务的场景,可以充分利用多核处理器的性能。

2. 使用 ​​ThreadPoolExecutor​​ 类创建线程池

ThreadPoolExecutor executor = new ThreadPoolExecutor(
    corePoolSize, 
    maximumPoolSize, 
    keepAliveTime, 
    TimeUnit.MILLISECONDS, 
    new LinkedBlockingQueue<Runnable>()
);

其中corePoolSize是线程池的核心线程数,maximumPoolSize是线程池的最大线程数,keepAliveTime是非核心线程空闲时间,TimeUnit.MILLISECONDS表示时间单位,new LinkedBlockingQueue()是任务队列。

  • 特点:使用 ThreadPoolExecutor 可以更灵活地配置线程池的各个参数,例如核心线程数、最大线程数、线程空闲时间和任务队列类型等。
  • 适用场景:适用于需要高度定制化线程池的场景,可以根据具体需求调整线程池的参数。

3. 使用 ​​ScheduledExecutorService​​ 创建定时任务线程池

ScheduledExecutorService executor = Executors.newScheduledThreadPool(nThreads);
  • 特点:创建一个固定大小的线程池,可以执行定时任务。
  • 适用场景:适用于需要定时或周期性执行任务的场景,如定时任务调度。

总结

  • newFixedThreadPool​:固定大小的线程池,适用于任务量已知且相对固定的场景,其背后使用的是无界的工作队列,任何时候最多有 nThreads 个工作线程是活动的。这意味着,如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目 nThreads;
  • newSingleThreadExecutor​:单线程的线程池,适用于需要按顺序执行任务的场景,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目;
  • newCachedThreadPool​:可缓存的线程池,适用于执行大量短期异步任务的场景,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用 SynchronousQueue 作为工作队列;
  • newScheduledThreadPool​:固定大小的线程池,支持定时任务,适用于需要定时或周期性执行任务的场景,和 newSingleThreadScheduledExecutor()类似,创建的是个 ScheduledExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程;
  • newSingleThreadScheduledExecutor​:单线程的线程池,支持定时任务,适用于需要按顺序执行定时任务的场景,返回 ScheduledExecutorService,可以进行定时或周期性的工作调度;
  • newWorkStealingPool​:工作窃取线程池,支持并行处理任务,适用于需要并行处理大量任务的场景。这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序;
  • ThreadPoolExecutor​:是最原始的线程池创建,高度定制化的线程池,适用于需要精确控制线程池行为的场景。

标签:场景,创建,池有,适用,任务,哪几种,线程,定时
From: https://www.cnblogs.com/89564f/p/18541542

相关文章

  • Mit6.S081笔记Lab7: Multithreading 多线程
    课程地址:https://pdos.csail.mit.edu/6.S081/2020/schedule.htmlLab地址:https://pdos.csail.mit.edu/6.S081/2020/labs/thread.html我的代码地址:https://github.com/Amroning/MIT6.S081/tree/threadxv6手册:https://pdos.csail.mit.edu/6.S081/2020/xv6/book-riscv-rev1.pdf相......
  • Java面试之多线程&并发篇
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!如何停止一个正在运行的线程?notify()和notifyAll()有什么区别?sleep()和wait()有什么区别?volatile是什么?可以保证有序性吗?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***如......
  • 深入理解Java线程池:线程任务完成检测的原理与实现
    在Java中,线程池(ThreadPool)是用于管理和复用线程的机制,通过它可以高效地管理多线程任务。一个常见的问题是:线程池是如何知道某个线程的任务已经完成的?本篇文章将深入探讨线程池任务完成的检测原理,并结合代码示例,让大家深入理解线程池的工作方式。推荐正在找工作的朋友们:就......
  • 线程进阶篇4:如何用Executors工具类创建线程池-代码演示-源码分析-可行性分析,对比new T
        本篇文章主要是讲解如何使用Executors工具类创建线程池,看本篇之前建议同学们先去看看我发布的上一篇文章,即用newThreadPoolExecutor()来创建线程池,里面讲解了线程池的参数使用方法和场景,熟悉了之后再来学习这一篇会更容易理解一些!因为Executors只是一个工具类,底层......
  • 多线程锁的升级原理是什么
      锁的级别:无锁=>偏向锁=>轻量级锁=>重量级锁 无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。  偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该......
  • 多线程锁的升级原理是什么
      锁的级别:无锁=>偏向锁=>轻量级锁=>重量级锁 无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个线程能成功修改资源,其他的线程会不断尝试,直至修改成功。  偏向锁:偏向锁是指当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储线程ID。一旦该......
  • 创建线程有哪几种方式
    1.继承​​Thread​​类优点:简单直观,适合初学者。直接继承​​Thread​​类,可以方便地访问和使用​​Thread​​类的方法。缺点:Java不支持多继承,因此如果你的类已经继承了其他类,则不能继承​​Thread​​类。仅适用于简单的线程任务。示例:classMyThreade......
  • 创建线程有哪几种方式
    1.继承​​Thread​​类优点:简单直观,适合初学者。直接继承​​Thread​​类,可以方便地访问和使用​​Thread​​类的方法。缺点:Java不支持多继承,因此如果你的类已经继承了其他类,则不能继承​​Thread​​类。仅适用于简单的线程任务。示例:classMyThreade......
  • 线程池都有哪些状态
    线程池有五种典型状态: 1.RUNNING(运行状态):在这个状态下,线程池可以接收新的任务提交,并且能够处理已添加到任务队列中的任务。这是线程池的初始状态,也是最活跃的状态。这是最正常的状态2.SHUTDOWN(关闭状态)当调用了线程池的`shutdown()`方法后,线程池进入此状态。此时,线程池不再......
  • 【多线程】---1115. 交替打印 FooBar
     解法1:condition_variable + mutex classFooBar{private:intn;mutexmtx;condition_variablecv;boolfoo_done=false;public:FooBar(intn){this->n=n;}voidfoo(function<void()>printFoo)......