ThreadPoolExecutor的corePoolSize和maximumPoolSize
来源:互联网 发布:局域网erp软件 编辑:程序博客网 时间:2024/06/03 19:19
按照JDK文档的描述,
如果池中的实际线程数小于corePoolSize,无论是否其中有空闲的线程,都会给新的任务产生新的线程
如果池中的线程数大于corePoolSize 并且小于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的实现就可以了^_^)。
- ThreadPoolExecutor的corePoolSize和maximumPoolSize
- ThreadPoolExecutor的corePoolSize和maximumPoolSize
- 理解ThreadPoolExecutor源码(一)线程池的corePoolSize、maximumPoolSize和poolSize
- 理解ThreadPoolExecutor源码(一)线程池的corePoolSize、maximumPoolSize和poolSize
- 线程池---ThreadPoolExecutor中corePoolSize,maximumPoolSize,workQueue的关系
- 使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
- ThreadPoolExecutor的使用和介绍
- ThreadPoolExecutor的使用和介绍
- ThreadPoolExecutor的shutDown和shutDownNow的区别
- ThreadPoolExecutor 的 shutdown() 和shutdownNow()
- ThreadPoolExecutor线程池的分析和使用
- ThreadPoolExecutor使用和思考
- ThreadPoolExecutor使用和思考
- ThreadPoolExecutor和CyclicBarrier配合使用可能带来的隐患
- threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
- ThreadPoolExecutor线程池的创建和参数详解
- 线程池ThreadPoolExecutor 和 ForkJoinPool 的分析使用
- ThreadPoolExecutor源码剖析的一些思考和总结
- SVN的标准目录结构:trunk、branches、tags
- Ngrok配置外网域名-解决开发中所需的特定端口
- es6 import & export
- JAVA反射机制详解
- Hibernate与MyBatis对比
- ThreadPoolExecutor的corePoolSize和maximumPoolSize
- 教你快速写出多线程Junit单元测试用例 - GroboUtils
- shell 脚本中常用的列表
- 目标跟踪流程
- Android中shape的使用
- 三次样条曲线
- 戴尔服务器r530 windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案
- IISReset批处理,不停执行 iisreset
- 【PTVS+Theano】在windows下使用VS安装theano深度学习工具