ThreadPoolExecutor的corePoolSize和maximumPoolSize
2015-10-08 15:19
543 查看
按照JDK文档的描述,
如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程
如果池中的线程数>corePoolSize and <maximumPoolSize,而又有空闲线程,就给新任务使用空闲线程,如没有空闲线程,则产生新线程
如果池中的线程数=maximumPoolSize,则有空闲线程使用空闲线程,否则新任务放入workQueue。(线程的空闲只有在workQueue中不再有任务时才成立)
ThreadPoolExecutor中有方法setCorePoolSize()和setMaximumPoolSize来设置corePoolSize和maximumPoolSize的大小,
如果新值大于旧值,则对新任务新线程
如果新值小于旧值,则在有线程空闲时,减少池中的线程数
但是在实际应用中想实时修改池的线程数,得有一定的条件,特别是要减少线程数,
首先,如果提交的新任务太多,以至总是没有线程空闲下来,线程就不会减少
即使有线程空闲,也不一定能减少线程,这还同所使用的workQueue有关,还需要workQueue.remainingCapacity==0。在JDK所提供的所有BlockingQueue中,只有SynchronousQueue的remainingCapacity()能返回0。
而如果实际应用中需要使用ScheduledThreadPoolExecutor来安排任务,同时需要新安排的任务数又非常多,这时要即时动态线程池的大小,就几乎不可能了,因为ScheduledThreadPoolExecutor用的是LinkedBlockingQueue。这时可以按照JDK的方式实现一个自己的ScheduledThreadPoolExecutor,
首先,稍微修改一下JDK的ThreadPoolExecutor就能实现一个自己的ThreadPoolExecutor,
在setCorePoolSize方法中,去掉workQueue.remainingCapacity==0的条件
让ThreadPoolExecutor中的Worker的interruptIfIdle()方法给Worker设置一个标志,让这个Worker不再检查workQueue中还没有执行的任务,立即中止
还有就是修改一下ThreadPoolExecutor中实现的RejectedExecutionHandler,毕竟很多情况下都可以不需要它
有了自己ThreadPoolExecutor,就可以继承它来实现自己的ScheduledThreadPoolExecutor了(再原本照抄JDK的ScheduledThreadPoolExecutor的实现就可以了^_^)。
终于有了符合自己需要的ScheduledThreadPoolExecutor了,现在用它来每秒运行1000个任务,还需要每个小时改变并发任务数(50~200之间的随机值),至少要维持30天。
如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程
如果池中的线程数>corePoolSize and <maximumPoolSize,而又有空闲线程,就给新任务使用空闲线程,如没有空闲线程,则产生新线程
如果池中的线程数=maximumPoolSize,则有空闲线程使用空闲线程,否则新任务放入workQueue。(线程的空闲只有在workQueue中不再有任务时才成立)
ThreadPoolExecutor中有方法setCorePoolSize()和setMaximumPoolSize来设置corePoolSize和maximumPoolSize的大小,
如果新值大于旧值,则对新任务新线程
如果新值小于旧值,则在有线程空闲时,减少池中的线程数
但是在实际应用中想实时修改池的线程数,得有一定的条件,特别是要减少线程数,
首先,如果提交的新任务太多,以至总是没有线程空闲下来,线程就不会减少
即使有线程空闲,也不一定能减少线程,这还同所使用的workQueue有关,还需要workQueue.remainingCapacity==0。在JDK所提供的所有BlockingQueue中,只有SynchronousQueue的remainingCapacity()能返回0。
而如果实际应用中需要使用ScheduledThreadPoolExecutor来安排任务,同时需要新安排的任务数又非常多,这时要即时动态线程池的大小,就几乎不可能了,因为ScheduledThreadPoolExecutor用的是LinkedBlockingQueue。这时可以按照JDK的方式实现一个自己的ScheduledThreadPoolExecutor,
首先,稍微修改一下JDK的ThreadPoolExecutor就能实现一个自己的ThreadPoolExecutor,
在setCorePoolSize方法中,去掉workQueue.remainingCapacity==0的条件
让ThreadPoolExecutor中的Worker的interruptIfIdle()方法给Worker设置一个标志,让这个Worker不再检查workQueue中还没有执行的任务,立即中止
还有就是修改一下ThreadPoolExecutor中实现的RejectedExecutionHandler,毕竟很多情况下都可以不需要它
有了自己ThreadPoolExecutor,就可以继承它来实现自己的ScheduledThreadPoolExecutor了(再原本照抄JDK的ScheduledThreadPoolExecutor的实现就可以了^_^)。
终于有了符合自己需要的ScheduledThreadPoolExecutor了,现在用它来每秒运行1000个任务,还需要每个小时改变并发任务数(50~200之间的随机值),至少要维持30天。
相关文章推荐
- 写给那些傻傻的,想做服务器开发的应届生
- 常用命令
- Updating to SVN 1.8 for Mac OS X 10.10 Yosemite (svn client is too old to work with working copy)
- WPF制作带圆角的文本框的两种方法
- 史上最全的maven pom.xml文件教程详解
- J360-cloud SpringCloud系列一:分布式配置服务器ConfigServer
- 休假归来,疲倦
- 软件工程作业
- CoffeeScript之,存在操作符“?”
- mp3 切割
- linux快速入门 1.1命令行操作
- JavaScript 跨域访问的问题和解决过程 【转载】
- oracle的substr函数的用法
- iPhone6s和iPhone6sPlus的适配
- 黑马程序员---OC学习笔记之protocol概念及基本使用
- 7. Spring验证、数据绑定和类型转换
- cocos代码研究(15)Widget子类CheckBox学习笔记
- Subversion command line client version is too old , bin\sendrpt.exe not found
- Guava-使用&&避免null
- jvm工具系列之 -- Java配置信息工具