线程池参数动态调整

线程池参数动态调整线程池的参数动态调整

大家好,又见面了,我是你们的朋友全栈君。

线程池的参数动态调整

总结:
线程池类 ThreadPoolExecutor 中已经提供了对应的方法,允许动态修改线程池参数:
1、动态修改核心数
当 allowCoreThreadTimeOut 参数设置为 true 的时候,
核心线程在空闲了 keepAliveTime 的时间后也会被回收的,
相当于线程池自动给你动态修改了
public void setCorePoolSize(int corePoolSize) { 
   
    if (corePoolSize < 0)
        throw new IllegalArgumentException();
    int delta = corePoolSize - this.corePoolSize;
    this.corePoolSize = corePoolSize;
    if (workerCountOf(ctl.get()) > corePoolSize)
        interruptIdleWorkers();
    else if (delta > 0) { 
   
        int k = Math.min(delta, workQueue.size());
        while (k-- > 0 && addWorker(null, true)) { 
   
            if (workQueue.isEmpty())
                break;
        }
    }
}

2、动态修改最大线程数
public void setMaximumPoolSize(int maximumPoolSize) { 
   
    if (maximumPoolSize <= 0 || maximumPoolSize < corePoolSize)
        throw new IllegalArgumentException();
    this.maximumPoolSize = maximumPoolSize;
    if (workerCountOf(ctl.get()) > maximumPoolSize)
        interruptIdleWorkers();
}

3、动态修改存活时间
public void setKeepAliveTime(long time, TimeUnit unit) { 
   
    if (time < 0)
        throw new IllegalArgumentException();
    if (time == 0 && allowsCoreThreadTimeOut())
        throw new IllegalArgumentException("Core threads must have nonzero keep alive times");
    long keepAliveTime = unit.toNanos(time);
    long delta = keepAliveTime - this.keepAliveTime;
    this.keepAliveTime = keepAliveTime;
    if (delta < 0)
        interruptIdleWorkers();
}

4、动态修改线程工厂
public void setThreadFactory(ThreadFactory threadFactory) { 
   
    if (threadFactory == null)
        throw new NullPointerException();
    this.threadFactory = threadFactory;
}

5、动态修改拒绝策略
public void setRejectedExecutionHandler(RejectedExecutionHandler handler) { 
   
    if (handler == null)
        throw new NullPointerException();
    this.handler = handler;
}

6、可以发现是没有提供方法修改线程队列的,这是因为线程队列的 capacity 参数被 final 所修饰了
private final int capacity;
但是我们可以自定义线程队列,然后把 capacity 参数去掉 final 修饰即可。
操作起来也非常方便,把 LinkedBlockingQueue 粘贴一份出来,修改个名字,
然后把 capacity 参数的 final 修饰符去掉,并提供其对应的 get/set 方法
private volatile int capacity;

public int getCapacity() { 
   
    return capacity;
}

public void setCapacity(int capacity) { 
   
    this.capacity = capacity;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134967.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql 取消外键约束_主键约束和外键约束什么意思

    mysql 取消外键约束_主键约束和外键约束什么意思**Mysql中取消外键约束**Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;然后将原来表的数据导出到sql语句,重新创建此表后,再把数据使用sql导入,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;…

    2022年10月21日
    3
  • 帆软报表,异常问题汇总

    帆软报表,异常问题汇总164.导出excel0kb内存不够或者磁盘空间不足163.UnresolvableOperation:mobileinclassReportDispatcher排除jar包和插件影响的话,可能是LIC里面没有决策平台功能点162.客户嵌入我们的url时出现报错Refusedtodisplay’URL’inaframebecauseitset’X-Fr…

    2022年10月3日
    4
  • Bootstrap表格示例

    Bootstrap表格示例效果图如下:代码如下:

    2025年6月2日
    3
  • 跳出循环语句

    跳出循环语句跳出循环语句

    2022年6月4日
    31
  • h2数据库连接mysql_H2数据库简单使用操作「建议收藏」

    h2数据库连接mysql_H2数据库简单使用操作「建议收藏」h2database官网下载客户端控制台h2databaseMaven配置com.h2databaseh21.4.1991控制台新建数据库与连接数据库1.1建库windows系统下点击h2/bin/h2.bat启动控制台应用程序鼠标右键点击桌面右下角图标Createanewdatabase…例如在k盘h2目录下新建helloForm数据库,则填写路径为k:/h2/helloForm…

    2022年8月31日
    6
  • 位运算符有哪些_或运算和异或运算

    位运算符有哪些_或运算和异或运算位运算符的计算主要用在二进制中。实际开发中也经常会遇到需要用到这些运算符的时候,同时这些运算符也被作为基础的面试笔试题。所以了解这些运算符对程序员来说是十分必要的。于此,记录下我所理解的运算符:如果以开关开灯论:有这样两个开关,0为开关关闭,1为开关打开。与(&)运算与运算进行的是这样的算法:0&0=0,0&1=0,1&0=0,1&1=1在与运算中两个开关是

    2022年10月10日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号