我遇到了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中可能存在的错误?...相关推荐

  1. java http url 401 unauthorized_java - 为什么我在Maven中收到“401 Unauthorized”错误?

    为什么我在Maven中收到"401 Unauthorized"错误? 这是我在调用mvn deploy -e(底部的完整日志)时遇到的错误: mvn deploy -e mvn d ...

  2. Java入门教程[9天快速入门JAVA]

    第一章 Java概述 §1.1Java语言出现的背景.影响及应用前景 一.背景 最近一年多来,在Internet上出现的特别吸引人的事件就是Java语言和用 Java编写的浏览器HotJava. 19 ...

  3. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  4. 【有料】Java线程池实现原理及其在美团业务中的实践

    随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员 ...

  5. 【java面试】6万字最全Java知识体系梳理,还在找面试题?看这篇就够啦

    文章目录 一.基础 1.1JVM 1.JVM五大内存区域 2.新生代和老年代 3.加载类的过程 4.OOM 5.JVM调优 1.2 GC 1.可达性分析 2.java中的引用 3.GC回收算法 4.G ...

  6. Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)

    阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 ​ 定义:被java赋予特殊含义的字符串(单词): ​ 关 ...

  7. java 解析m3u8的实例_使用java线程池批量下载m3u8。合并mp4.

    使用java线程池批量下载m3u8合并mp4. 看了线程池的demo,然后就想下载文件试试. 代码未必规范,多多建议. 大家可以自行修改,满足自己的需求. 还需要深入学习一下线程池. 给俺个星星⭐,可 ...

  8. java线程池面试题有哪些?java线程池常见面试题

    进行java面试的过程中,java线程池是必问的面试题目,因为这是java的重点知识,也是在java工作中经常会遇到的,那java线程池面试题有哪些?下面来我们就来给大家讲解一下java线程池常见面试 ...

  9. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

最新文章

  1. mockjs针对name的value设置生成规则语法示例
  2. JAVA的IO编程:管道流
  3. tracert路由检测命令使用方法
  4. Python 3 报错 TypeError: object() takes no parameters【新手必过坑之一】
  5. CentOS 最小化安装后安装桌面
  6. [转帖]三大运营商2G/3G/4G频率分配和网络制式
  7. Python scapy网络包嗅探模块(转载)
  8. 中国高铁线路、列车、开通时间数据(2003-2020年)
  9. java 最新手机号校验
  10. 国内使用谷歌地图方案
  11. 字节跳动薪酬体系最全揭晓|看完我是真酸了,不服不行
  12. BCJC:30: 计算机术语:读和写操作
  13. IE8打开网页慢速度优化
  14. 机器学习:self-paced 和 fine-tuning
  15. C++阶段03笔记03【文件操作(文本文件读写、二进制文件读写)】
  16. 如何设置EXCEL里标题在每页都打印?
  17. 机器学习偏见可能会定义少数族裔的健康状况
  18. UltraEdit自动化脚本
  19. 思岚科技Athena打破机器人底盘价格极限
  20. android dslr控制软件,dslr camera安卓版

热门文章

  1. 前端学习(622):变量的命名规范
  2. java学习(130):treemap类
  3. Python reload() 函数
  4. linux下ffmpeg安装
  5. git使用.ignore忽略工程中的文件变动
  6. android层级关系图,画出 View 的层级 3D 图和树形图来分析层级关系
  7. python 的库如何开发_一篇文章入门Python生态系统
  8. yii验证系统学习记录,基于yiicms(一)写的太长了,再写一篇(二)
  9. 普通树与二叉树的相互转化及哈夫曼树的了解
  10. 在caffe中使用hdf5的数据