java maximumpoolsize,如果maximumPoolSize小于corePoolSize怎么办? Java 6中可能存在的错误?...
我遇到了Java 6的ThreadPoolExecutor一个奇怪的问题 . 我不时地动态更改了corePoolSize,我观察到线程池没有处理应该完成的任务 .
例如,如果我有4个corePoolSize并且队列中有许多任务等待,那么执行程序最多处理3个,有时甚至是2个 .
在调查问题的时候,我注意到当我增加或减少corePoolSize时我从未改变过maxPoolSize . 从我的申请开始,它一直是1 .
从来没有在Java的文档中找到一个声明,提到maxPoolSize的效果小于核心 .
然后当我检查源代码时,我注意到在costructor和setCorePoolSize方法中,它会检查maximumPoolSize小于corePoolSize的位置,如果是这样,则抛出illegalArgumentException . 看看下面的代码 .
构造函数
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
设置最大池大小
public void setMaximumPoolSize(int maximumPoolSize) {
if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
throw new IllegalArgumentException();
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
int extra = this.maximumPoolSize - maximumPoolSize;
this.maximumPoolSize = maximumPoolSize;
if (extra > 0 && poolSize > maximumPoolSize) {
try {
Iterator it = workers.iterator();
while (it.hasNext() &&
extra > 0 &&
poolSize > maximumPoolSize) {
it.next().interruptIfIdle();
--extra;
}
} catch (SecurityException ignore) {
// Not an error; it is OK if the threads stay live
}
}
} finally {
mainLock.unlock();
}
}
所以,显然这是一个不受欢迎的情况 . 但是没有检查setCorePoolSize,导致maximumPoolSize最终小于corePoolSize,并且没有记录这种情况的影响 .
设置核心池大小
public void setCorePoolSize(int corePoolSize) {
if (corePoolSize < 0)
throw new IllegalArgumentException();
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
int extra = this.corePoolSize - corePoolSize;
this.corePoolSize = corePoolSize;
if (extra < 0) {
int n = workQueue.size(); // don't add more threads than tasks
while (extra++ < 0 && n-- > 0 && poolSize < corePoolSize) {
Thread t = addThread(null);
if (t == null)
break;
}
}
else if (extra > 0 && poolSize > corePoolSize) {
try {
Iterator it = workers.iterator();
while (it.hasNext() &&
extra-- > 0 &&
poolSize > corePoolSize &&
workQueue.remainingCapacity() == 0)
it.next().interruptIfIdle();
} catch (SecurityException ignore) {
// Not an error; it is OK if the threads stay live
}
}
} finally {
mainLock.unlock();
}
}
难道你不认为应该有一种机制阻止这种情况结束吗?
java maximumpoolsize,如果maximumPoolSize小于corePoolSize怎么办? Java 6中可能存在的错误?...相关推荐
- java http url 401 unauthorized_java - 为什么我在Maven中收到“401 Unauthorized”错误?
为什么我在Maven中收到"401 Unauthorized"错误? 这是我在调用mvn deploy -e(底部的完整日志)时遇到的错误: mvn deploy -e mvn d ...
- Java入门教程[9天快速入门JAVA]
第一章 Java概述 §1.1Java语言出现的背景.影响及应用前景 一.背景 最近一年多来,在Internet上出现的特别吸引人的事件就是Java语言和用 Java编写的浏览器HotJava. 19 ...
- Java线程池实现原理及其在美团业务中的实践
来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...
- 【有料】Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...
- 【java面试】6万字最全Java知识体系梳理,还在找面试题?看这篇就够啦
文章目录 一.基础 1.1JVM 1.JVM五大内存区域 2.新生代和老年代 3.加载类的过程 4.OOM 5.JVM调优 1.2 GC 1.可达性分析 2.java中的引用 3.GC回收算法 4.G ...
- Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)
阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 定义:被java赋予特殊含义的字符串(单词): 关 ...
- java 解析m3u8的实例_使用java线程池批量下载m3u8。合并mp4.
使用java线程池批量下载m3u8合并mp4. 看了线程池的demo,然后就想下载文件试试. 代码未必规范,多多建议. 大家可以自行修改,满足自己的需求. 还需要深入学习一下线程池. 给俺个星星⭐,可 ...
- java线程池面试题有哪些?java线程池常见面试题
进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...
- Java多线程干货系列—(一)Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
最新文章
- mockjs针对name的value设置生成规则语法示例
- JAVA的IO编程:管道流
- tracert路由检测命令使用方法
- Python 3 报错 TypeError: object() takes no parameters【新手必过坑之一】
- CentOS 最小化安装后安装桌面
- [转帖]三大运营商2G/3G/4G频率分配和网络制式
- Python scapy网络包嗅探模块(转载)
- 中国高铁线路、列车、开通时间数据(2003-2020年)
- java 最新手机号校验
- 国内使用谷歌地图方案
- 字节跳动薪酬体系最全揭晓|看完我是真酸了,不服不行
- BCJC:30: 计算机术语:读和写操作
- IE8打开网页慢速度优化
- 机器学习:self-paced 和 fine-tuning
- C++阶段03笔记03【文件操作(文本文件读写、二进制文件读写)】
- 如何设置EXCEL里标题在每页都打印?
- 机器学习偏见可能会定义少数族裔的健康状况
- UltraEdit自动化脚本
- 思岚科技Athena打破机器人底盘价格极限
- android dslr控制软件,dslr camera安卓版