ThreadPoolExecutor线程大于corePoolsize的多出线程是咋产生的
首先 维持一定的线程数 防止在任务来临时创建线程影响性能然后 当池中现存的线程数已经全部被使用之后 开始向队列中保存任务 如果队列满了 则创建临时线程来处理任务 当高峰期过后会被回收 减少无意义的线程切换 释放掉线程占用的资源 检查频率由线程存活时间决定队列类型要自己选择(定长队列、无界队列、以及一个不允许添加任务元素的队列...) 无界队列永远也不会触发reject和对临时线程的使用如果队列满了 并且临时线程也用光了 则通过回调开发者提供的java.util.concurrent.RejectedExecutionHandler实例来处理该任务题主可以看看java.util.concurrent.Executors是如何利用这些参数基于java.util.concurrent.ThreadPoolExecutor创造出不同的线程池的
■网友
首先,线程池有三个描述线程数的字段:maximumPoolSize、corePoolSize、poolSize,前面两个是常量,第三个是变化的,满足:corePoolSize\u0026lt;=poolSize\u0026lt;=maximumPoolSize当poolSize\u0026gt;corePoolSize而且有线程空闲的时间超过keepAliveTime时,这些线程会被释放掉,从而poolSize会减少,直到poolSize等于corePoolSize。至于为什么会多出线程,是因为有很多任务加入到线程池,导致原来corePoolSize个线程不够用,线程池就会创建新线程执行新添加的任务,直到poolSize达到maximumPoolSize
■网友
实名赞同 @赵北云@BlackJoker 的答案,感谢回答。public void execute(Runnable command) { if (command == null) throw new NullPointerException(); if (poolSize \u0026gt;= corePoolSize || !addIfUnderCorePoolSize(command)) { if (runState == RUNNING \u0026amp;\u0026amp; workQueue.offer(command)) { if (runState != RUNNING || poolSize == 0) ensureQueuedTaskHandled(command); } else if (!addIfUnderMaximumPoolSize(command)) reject(command); // is shutdown or saturated } }这是ThreadPoolExecutor类中execute(Runnable command)方法的实现,这个方法事实上来自于Executor接口,Executor顾名思义线程执行器,是线程池的管理执行者,线程池的作用自然就是减少线程创建和销毁的开销。ThreadPoolExecutor既然是一个线程池,那么所谓池子的概念和意义多半在于充分利用资源,线程池当然就是为了充分利用线程资源,即尽量减少新建和销毁线程所产生的开销。首先这个线程池中有三个关于池子中线程数量的变量maximumPoolSize、corePoolSize、poolSize 分别是池子中允许的最大线程数,池子中正常情况下保持的最多线程数(即当当前线程数量大于corePoolsize的时候,多出来的线程在没有任务执行的时候会被销毁,而问题中的keepAliveTime就是这些超过corePoolsize数值的线程存活的最大时间)下面介绍下什么时候ThreadPoolExecutor当中创建了大于corePoolSize值得线程。几个已知情报:①建立ThreadPoolExecutor的时候,默认poolSize当前线程池中线程数量是0②private final ReentrantLock mainLock = new ReentrantLock(); 互斥锁 也称为独占锁:同一时间只有一个线程获取锁,再有线程尝试加锁,将失败。③private final BlockingQueue\u0026lt;Runnable\u0026gt; workQueue; workQueue的offer方法在添加失败的时候会返回false不向add那样会抛出一个异常,线程池的等待队列值是要设置的,在poolSize达到corePoolSize的时候并且队列满的时候就会创建大于corePoolSize且小于等于maximumPoolSize值的线程执行过程(1) 检查command == null (2) if (poolSize \u0026gt;= corePoolSize || !addIfUnderCorePoolSize(command)) 显然只有一个if方法,必须会在if方法内或者条件判断内将执行任务的逻辑完成(3)在poolSize \u0026lt; corePoolSize的时候,执行runnable任务的过程在后一个条件判断当中
推荐阅读
- 豪车|玛莎拉蒂推出限量版新车,噱头大于实际意义
- 将ipad应用于课堂是利大于弊还是弊大于利
- 汽车知识|形式大于内容,长安CS75百万版上市,中期改款主要是换壳
- 现在很多都是无限流量了iPhone大于150MB的app不能下载,有没有大佬有啥好的办法解决
- 这些体检项目 套路大于实效,慎做!
- 多线程编程中join这个单词为啥有等待结束的意思
- 钟南山|钟南山:人的寿命应该大于100岁!他的5句话,每个人都该听听
- 车之养护|都知道7座车噱头大于实际,那为什么不考虑买6座呢?
- 怎样理解servlet单例引起的线程安全问题
- 使用无锁队列还是线程同步锁?
