依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 18|回复: 0

ThreadPoolExecutor的corePoolSize、maximumPoolSize和poolSize

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
15493
发表于 昨天 12:11 | 显示全部楼层 |阅读模式
ThreadPoolExecutor的corePoolSize、maximumPoolSize和poolSize
看两段源码:
  1. public ThreadPoolExecutor(int corePoolSize,

  2.         int maximumPoolSize,

  3.         long keepAliveTime,

  4.         TimeUnit unit,

  5.         BlockingQueue<Runnable> workQueue,

  6.         ThreadFactory threadFactory,

  7.         RejectedExecutionHandler handler) {

  8.         if (corePoolSize < 0 ||

  9.         maximumPoolSize <= 0 ||

  10.         maximumPoolSize < corePoolSize ||

  11.         keepAliveTime < 0)

  12.         throw new IllegalArgumentException();

  13.         if (workQueue == null || threadFactory == null || handler == null)

  14.         throw new NullPointerException();

  15.         this.acc = System.getSecurityManager() == null ?

  16.         null :

  17.         AccessController.getContext();

  18.         this.corePoolSize = corePoolSize;

  19.         this.maximumPoolSize = maximumPoolSize;

  20.         this.workQueue = workQueue;

  21.         this.keepAliveTime = unit.toNanos(keepAliveTime);

  22.         this.threadFactory = threadFactory;

  23.         this.handler = handler;

  24.         }

  25. private boolean addWorker(Runnable firstTask, boolean core) {

  26.         retry:

  27.         for (;;) {

  28.         int c = ctl.get();

  29.         int rs = runStateOf(c);

  30.      // Check if queue empty only if necessary.

  31.         if (rs >= SHUTDOWN &&

  32.         ! (rs == SHUTDOWN &&

  33.         firstTask == null &&

  34.         ! workQueue.isEmpty()))

  35.         return false;

  36.         for (;;) {

  37.         int wc = workerCountOf(c);

  38.         if (wc >= CAPACITY ||

  39.         wc >= (core ? corePoolSize : maximumPoolSize))

  40.         return false;

  41.         if (compareAndIncrementWorkerCount(c))

  42.         break retry;

  43.         c = ctl.get(); // Re-read ctl

  44.         if (runStateOf(c) != rs)

  45.         continue retry;

  46.     // else CAS failed due to workerCount change; retry inner loop

  47.         }

  48.         }

  49.         boolean workerStarted = false;

  50.         boolean workerAdded = false;

  51.         Worker w = null;

  52.         try {

  53.         w = new Worker(firstTask);

  54.     final Thread t = w.thread;

  55.         if (t != null) {

  56.     final ReentrantLock mainLock = this.mainLock;

  57.         mainLock.lock();

  58.         try {

  59. // Recheck while holding lock.

  60. // Back out on ThreadFactory failure or if

  61. // shut down before lock acquired.

  62.         int rs = runStateOf(ctl.get());

  63.         if (rs < SHUTDOWN ||

  64.         (rs == SHUTDOWN && firstTask == null)) {

  65.         if (t.isAlive()) // precheck that t is startable

  66.         throw new IllegalThreadStateException();

  67.         workers.add(w);

  68.         int s = workers.size();

  69.         if (s > largestPoolSize)

  70.         largestPoolSize = s;

  71.         workerAdded = true;

  72.         }

  73.         } finally {

  74.         mainLock.unlock();

  75.         }

  76.         if (workerAdded) {

  77.         t.start();

  78.         workerStarted = true;

  79.         }

  80.         }

  81.         } finally {

  82.         if (! workerStarted)

  83.         addWorkerFailed(w);

  84.         }

  85.         return workerStarted;

  86.         }
复制代码
以上可以看出,ThreadPoolExecutor的主要参数有:corePoolSize , maximumPoolSize , keepAliveTime ,workQueue,threadFactory,handler ,对于几个参数,我们该如何理解呢?
先看看这几个参数:
corePoolSize :
顾名思义,核心线程大小,即在没有任务需要执行的时候线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程;
maximuxPoolSize :
线程池中允许创建的最大线程数大小;
poolSize :
当前线程池中线程的数量,当改值为0的时候,意味着没有任何线程,线程池会终止;同时,poolSize不会超过maximumPoolSize;
看看官方解释:
Queuing
Any BlockingQueue may be used to transfer and hold submitted tasks. The use of this queue interacts with pool sizing:
● If fewer than corePoolSize threads are running, the Executor always prefers adding a new thread rather than queuing.
● If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
● If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.
理解:
1、如果当前线程池的线程数还没有达到核心线程数大小,即 poolSize < corePoolSize ,无论是否有空闲的线程,系统回新增一个线程来处理新提交的任务;
2、如果当前线程池的线程数大于或者等于核心线程数大小,即 poolSize >= corePoolSize,且任务队列未满时,将提交的任务提交到阻塞队列中,等待处理workQueue.offer(command);
3、如果当前线程池的线程数大于或者等于核心线程数大小,即 poolSize >= corePoolSize,且任务队列已满时,分以下两种情况:
3.1、poolSize < maximumPoolSize ,新增线程来处理任务;
3.2、poolSize = maximuxPoolSize ,意味中线程池的处理能力已经达到极限,此时会拒绝增加新的任务,至于如何拒绝,取决于RejectedExecutionHandler

相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-4-16 11:46

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表