线程池参数动态调整

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

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

线程池的参数动态调整

总结:
线程池类 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • dfile.encoding=utf-8 乱码_OrdosTF格式是什么格式

    dfile.encoding=utf-8 乱码_OrdosTF格式是什么格式解析ASN10x80问题所有X509证书都用一种ASN1格式,其为一种嵌套储存格式。ASN1规则繁琐,此文不说明,可以研究此链接。本文主要说明0x80问题,同事问起这问题,一时想不起来,现在在此备份。所有ASN1格式都是0x30开头,表示ASN1tag;0x82用来表示03C2的长度,先搁置;而03C2其用来表示后面数据长度,如下所示。308203C

    2022年9月12日
    2
  • javascript正则表达式 教程_js正则表达式匹配字符串

    javascript正则表达式 教程_js正则表达式匹配字符串JavaScript正则表达式的模式匹配引言正文一、正则表达式定义引言其实我写这篇文章的话,主要是想自己重新复习一遍正则表达式。我们也知道正则表达式在很多语言中都是通用的,所以学好这个好处很多。接下来,就跟我一起来学习一下正则表达式,从0到入门吧。正文一、正则表达式定义正则表达式(regularexpression)是一个描述字符模式的对象,简单点来讲就是通过正则表达式规定的模式,…

    2022年9月20日
    1
  • JS如何取整数

    JS如何取整数1.丢弃小数部分,保留整数部分parseInt(5/2)2.向上取整,有小数就整数部分加1Math.ceil(5/2)3,四舍五入.Math.round(5/2)4,向下取整Math.floor(5/2)

    2022年6月16日
    35
  • Mysql 查看执行慢的sql语句「建议收藏」

    Mysql 查看执行慢的sql语句

    2022年2月17日
    62
  • Pycharm安装包超时:ReadTimeoutError

    Pycharm安装包超时:ReadTimeoutErrorPycharm会自动安装pip、setuptools、wheel,安装numpy等包时,由于国外服务器,导致下载延时,无法安装,可使用使用pip.exe解决。Win+R,Enter后打开cmd,在你的python工程下venv-Scripts下,pip.exe右键,ShowinExplorer,打开所在文件夹,将pip.exe拖入cmd,执行查看所有可用命令、查看当前工程已安装的包、安装包…

    2022年5月17日
    98

发表回复

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

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