-
2022-02-18 14:55:46
线程池参数详解:
1、corePoolSize: 核心线程数量,线程池中会存在这么多个线程,当线程数量(包含空闲线程)少于corePoolSize的时候,会优先创建新线程,可以设置allowCoreThreadTimeOut=true来让核心线程池中线程也移除
2、maximumPoolSize: 线程池的最大容量,线程池中的线程数量不得超过这么多个,除非阻塞队列设置为无界的
3、keepAliveTime: 空闲线程存活时间,线程空闲超过这个时间的时候就会销毁
4、unit: keepAliveTime的时间单位,分钟、秒等
5、workQueue: 线程工作队列,阻塞队列,线程池从这个队列中取线程,可以设置的队列类型(容量为:capacity):
ArrayBlockingQueue:有界阻塞队列,当线程数量n:corePoolSize <= n < maximumPoolSize 且 n >= capacity :创建新线程处理任务 当:n >= maximumPoolSize 且 n >= capacity 拒绝线程
LinkedBlockingQueue: 无界队列,maximumPoolSize不起作用,会一直创建线程
SynchronousQuene: 不缓存任务,直接调度执行,线程数超过 maximumPoolSize 则直接拒绝线程
PriorityBlockingQueue: 带优先级的线程队列
6、handler: 拒绝策略,线程数量达到maximumPoolSize时的策略,默认提供了4种:
AbortPolicy: 直接丢弃并抛出异常
CallerRunsPolicy: 线程池没有关闭则直接调用线程的run方法
DiscardPolicy: 直接丢弃任务
DiscardOldestPolicy: 丢弃最早的任务,并尝试把当前任务加入队列
7、threadFactory: 创建线程时使用的工厂,可以对线程进行统一设置,如是否守护线程、线程名等更多相关内容 -
Java线程池七个参数详解
2019-04-23 11:14:33java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、...java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。
从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。
一、corePoolSize 线程池核心线程大小
线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话,则会创建一个新线程来处理这个任务。
二、maximumPoolSize 线程池最大线程数量
当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍)中。如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。
三、keepAliveTime 空闲线程存活时间
一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由keepAliveTime来设定
四、unit 空闲线程存活时间单位
keepAliveTime的计量单位
五、workQueue 工作队列
新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。jdk中提供了四种工作队列:
①ArrayBlockingQueue
基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。
②LinkedBlockingQuene
基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而基本不会去创建新线程直到maxPoolSize(很难达到Interger.MAX这个数),因此使用该工作队列时,参数maxPoolSize其实是不起作用的。
③SynchronousQuene
一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。
④PriorityBlockingQueue
具有优先级的无界阻塞队列,优先级通过参数Comparator实现。
六、threadFactory 线程工厂
创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等
七、handler 拒绝策略
当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里的拒绝策略,就是解决这个问题的,jdk中提供了4中拒绝策略:
①CallerRunsPolicy
该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。
②AbortPolicy
该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。
③DiscardPolicy
该策略下,直接丢弃任务,什么都不做。
④DiscardOldestPolicy
该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列
到此,构造线程池时的七个参数,就全部介绍完毕了。
个人独立博客:JAVA线程池七个参数详解 - IT小跟班的技术博客
-
Java自定义线程池七个参数具体是什么
2022-03-11 14:56:53线程池的使用线程属于系统的宝贵资源,频繁的创建和销毁线程,会降低效率,所以需要使用线程池
Java开发中百分之99都是单线程开发,但是一单用到多线程,肯定是用到线程池.
有两种使用方法
方法一:使用Executors工具类的两个静态方法来创建,很简单,直接类型.方法名就可以,但是不推荐.ali的开发手册就明确规定了禁止使用Executors工具类的静态方法来创建.要求使用自定义线程池的方法来使用
方法二:创建自定义线程池
首先看要搞明白线程池的参数
JDK中ThreadPoolExecutor类:可以创建线程池对象,但构造方法参数太多,接下来我们就来认识一下都有哪些参数:
第一个参数 int corePoolSize : 核心线程数
线程任务会分为两种:
(1)IO密集型(用于读取/写入文件) = 当前机器的核心数 * 2
(2)CPU密集型(运算) = 当前机器的核心数 + 1
当前机器核心数=电脑CPU的内核,可以通过 任务管理器->性能 查看
第二个参数 int maximumPoolSize : 最大线程数
核心线程数 + 临时线程数 = 最大线程数 比如核心:12 最大:20 临时:3
第三个参数 long keepAliveTime : 临时线程最大存活时间(这是一个数值,并没有单位)
第四个参数 TimeUnit unit : 临时线程最大存活时间(这个是单位) 枚举 (用法:枚举类名.枚举项名)
第五个参数 BlockingQueue<Runnable> workQueue : 阻塞队列(用于存储还没有执行的线程任务)
分为有界和无界两种
(1)有界阻塞队列(规定队列的长度) ArrayBlockingQueue 构造方法指定长度
(2)无界阻塞队列(不规定队列的长度) LinkedBlockingQueue
第六个参数 ThreadFactory threadFactory : 线程工厂
有固定的写法 Thread::NEW 或者 Executors.defaultThreadFactory()
第七个参数 RejectedExecutionHandler handler : 默认拒绝处理策略(当线程任务数量超过了最大线程数+阻塞队列长度时才会起作用)
有四种处理方式
静态内部类的创建方式:new 外部类名.内部类名();
(1)AbortPolicy : 一旦无法处理,直接抛出异常.
(2)DiscardPolicy : 一旦无法处理,不抛异常(把多余的任务丢弃掉)
(3)DiscardOldestPolicy : 一旦无法处理,用无法处理的任务替换阻塞队列中等待时间最长的任务.
(4)CallerRunsPolicy : 将无法处理的任务,绕过线程池,让当前线程执行,比如main线程
第一次写博客,看过的家人们劳烦给个点赞支持一下哦!
-
Java线程池七个参数详解(转载)
2022-02-18 10:59:48java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、...java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。
从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。
一、corePoolSize 线程池核心线程大小
线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。
二、maximumPoolSize 线程池最大线程数量
一个任务被提交到线程池以后,首先会找有没有空闲存活线程,如果有则直接将任务交给这个空闲线程来执行,如果没有则会缓存到工作队列(后面会介绍)中,如果工作队列满了,才会创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。
三、keepAliveTime 空闲线程存活时间
一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由keepAliveTime来设定
四、unit 空闲线程存活时间单位
keepAliveTime的计量单位
五、workQueue 工作队列
新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。jdk中提供了四种工作队列:
①ArrayBlockingQueue
基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。
②LinkedBlockingQuene
基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而不会去创建新线程直到maxPoolSize,因此使用该工作队列时,参数maxPoolSize其实是不起作用的。
③SynchronousQuene
一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。
④PriorityBlockingQueue
具有优先级的无界阻塞队列,优先级通过参数Comparator实现。
六、threadFactory 线程工厂
创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等
七、handler 拒绝策略
当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里的拒绝策略,就是解决这个问题的,jdk中提供了4中拒绝策略:
①CallerRunsPolicy
该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。
功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。
使用场景:一般在不允许失败的、对性能要求不高、并发量较小的场景下使用,因为线程池一般情况下不会关闭,也就是提交的任务一定会被运行,但是由于是调用者线程自己执行的,当多次提交任务时,就会阻塞后续任务执行,性能和效率自然就慢了。
**②AbortPolicy(线程池默认策略**)
该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。
功能:当触发拒绝策略时,直接抛出拒绝执行的异常,中止策略的意思也就是打断当前执行流程使用场景:这个就没有特殊的场景了,但是一点要正确处理抛出的异常。ThreadPoolExecutor中默认的策略就是AbortPolicy,ExecutorService接口的系列ThreadPoolExecutor因为都没有显示的设置拒绝策略,所以默认的都是这个。但是请注意,ExecutorService中的线程池实例队列都是无界的,也就是说把内存撑爆了都不会触发拒绝策略。当自己自定义线程池实例时,使用这个策略一定要处理好触发策略时抛的异常,因为他会打断当前的执行流程。
③DiscardPolicy
该策略下,直接丢弃任务,什么都不做。
功能:直接静悄悄的丢弃这个任务,不触发任何动作使用场景:如果你提交的任务无关紧要,你就可以使用它 。因为它就是个空实现,会悄无声息的吞噬你的的任务。所以这个策略基本上不用了
④DiscardOldestPolicy
该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列
功能:如果线程池未关闭,就弹出队列头部的元素,然后尝试执行使用场景:这个策略还是会丢弃任务,丢弃时也是毫无声息,但是特点是丢弃的是老的未执行的任务,而且是待执行优先级较高的任务。基于这个特性,我能想到的场景就是,发布消息,和修改消息,当消息发布出去后,还未执行,此时更新的消息又来了,这个时候未执行的消息的版本比现在提交的消息版本要低就可以被丢弃了。因为队列中还有可能存在消息版本更低的消息会排队执行,所以在真正处理消息的时候一定要做好消息的版本比较。
-
自定义线程池(线程池7个参数)
2021-02-04 08:40:01自定义线程池(线程池7个参数) package src.main.java.com.qqjx.thread; /* * @Auther wangpeng * @Date 2021/2/4 */ import java.io.IOException; import java.util.concurrent.*; public class T05_00_Hello... -
Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝...
2021-04-11 18:15:06源码简介 ThreadPoolExecutor是JDK中的线程池实现,这...共有7个参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler,下面将对这7个参数展开讲解。 public ThreadPool -
Java线程池七个参数详解Executors
2021-04-08 14:01:40java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、... -
ThreadPoolExecutor 线程池的七个参数
2022-02-12 10:55:50theme: channing-cyan highlight: androidstudio 「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」 ...凌晨的时候说了一下那个线程池的有关七个参数,那么这里完整的大致说一下. -
线程池的7大参数
2022-02-19 08:25:04参考:...直接调用Executors的简单方法创建的4大线程池 ...自定义线程池:使用创建ThreadPoolExecutor类,并添加参数创建线程池 最全的构造函数:其中还有其他的构造函 -
线程池的七大参数
2021-07-03 15:16:521.看一下三大方法的底层源码,都是调用了... public ThreadPoolExecutor(int corePoolSize,//核心线程池大小 int maximumPoolSize,//最大核心线程池大小 long keepAliveTime,//超时了没有人调用就会释放 -
线程池七个参数的含义
2021-11-16 21:40:03线程池七个参数的含义 import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** ... -
【逢考必问】Java线程池七个参数详解
2020-09-17 20:07:24java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。 从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、... -
Java线程池七大参数详解和配置
2021-06-25 23:16:22目录一、corePoolSize核心线程数二、maximunPoolSize最大线程数三、keepAliveTime空闲线程存活时间四、unit空闲线程存活时间的单位五、...阻塞队列六、threadFactory线程工厂七、handler超出线程数和工作队列时候 -
线程池的解析以及7个参数
2022-03-28 17:33:37线程池的七个参数2.线程池的执行流程3.线程池的属性标识3.1、 核心属性3.2、线程池状态变化4.线程池的execute()方法执行4.1、execute()4.2、addWorker() 1.线程池的七个参数 1、corePoolSize: 核心线程数 2、... -
创建线程池的7个参数
2022-03-04 15:42:34public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, ... 6.threadFactory:创建线程池中工作线程的工厂 7.handler:拒绝策略,当任务队列满了以后当前线程数量大于等于corePoolSize时就会执行该策略 -
线程池七大参数
2019-08-09 21:43:193.keepAliveTime:多余的线程没有任务执行之后,线程在线程池中最多待多久的时间才销毁,直到只剩下corePoolSize个线程为止。 4.TimeUnit:参数keepAliveTime的时间单位,一共7种取值 TimeUnit.DAYS; //天 ... -
Java线程池的7个参数
2019-03-31 15:19:37java.uitl.concurrent.ThreadPoolExecutor类是线程池中核心的一个类,在ThreadPoolExecutor中提供了四个构造方法。通过源码可以发现,前面三个的构造器最后都是调用了第四个构造器进行初始化。 public class ... -
线程池7大参数的作用,及其原理总结
2021-06-24 13:36:03当提交一个任务到线程池时,线程池会创建一个核心线程来执行任务,即使其他空闲的核心线程能够执行新任务也会创建新的核心线程,而等到需要执行的任务数大于线程池核心线程的数量时就不再创建,这里也可以理解为当... -
面试题:线程池7大参数
2021-01-06 15:30:00线程池7大参数 public ThreadPoolExecutor(int corePoolSize, // 1 int maximumPoolSize, // 2 long keepAliveTime, // 3 ... -
java 线程池七个参数详解
2020-12-21 09:41:21这个idle Thread就是上面提到的超过 corePoolSize 后新创建的那些线程,默认情况下,只有当线程池中的线程数大于corePoolSize,且这些"idle Thread"并没有被分配任务时,这个参数才会起作用。另外,如果调用了 ... -
Java线程池七个参数
2021-05-16 14:08:29Java线程池的构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue -
线程池七个参数与阿里巴巴开发手册
2020-08-11 23:00:58线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。 如何创建线程池 可以通过ExecutorService... -
创建线程池以及七个参数(拒绝繁琐的文字)
2022-02-17 13:56:22用于缓存任务的阻塞队列(最多存在多少个任务) * 以下参数可省略:不指定则选择默认 * threadFactory:指定创建线程的工厂 * 拒绝策略:handler:表示当workQueue已满,且池中的线程数达到maximumPoolSize时,线程池...