线程池参数动态调整

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

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

线程池的参数动态调整

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


相关推荐

  • Linux清理挖矿程序

    Linux清理挖矿程序Linux清理挖矿程序@bugLinux清理挖矿程序最近服务器经常被挖矿,一些经验1.找到挖矿程序挖矿程序跑起来几乎占满了所有的CPU,以及GPU,用watch-n1nvidia-smi可以实时看到挖矿程序的PID号,此时不能用kill-9PID号来进行清楚,会发现它换一个PID号继续跑,基本上关机、重启、改密码等操作它也会自动跑上。使用top可以看到挖矿程序进程名字xxx(command一行),psaux|grepxxx或者ls-l/proc/{PID号}/exe找到病毒

    2022年6月29日
    29
  • mysql——cmd进入mysql及常用的mysql操作[通俗易懂]

    mysql——cmd进入mysql及常用的mysql操作[通俗易懂]cmd进入mysql操作win+R,输入cmd,打开cmd窗口,进入到mysqlbin目录的路径下第一步:启动mysql服务,可以通过“netstartmyql”命令实现;第二步:先使用DOS命令进入mysql的安装目录下的bin目录中;第三步:在命令行输入:mysql-u用户名-p密码;回车;-h表示服务器名,localhost表示本地,-hlocalhost可不输入;-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,可直接在-p后链接输入,如

    2022年6月9日
    36
  • SpringBoot数据库访问异常HikariPool-1 – Exception during pool initialization.[通俗易懂]

    SpringBoot数据库访问异常HikariPool-1 – Exception during pool initialization.[通俗易懂]权限问题

    2022年6月23日
    226
  • Java葵花宝典(一)

    Java葵花宝典(一)1.面向对象和面向过程的区别面向过程:是以事件为中心,按照我们编写的代码,根据完成步骤的过程来执行的优点:面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要考量的因素的时候,比如单片机开发,嵌入式开发,Linux一般采用面向过程开发缺点:没有面向对象易维护、易复用、易扩展面向对象:将事物高度抽象化,我们把要完成的功能高度抽象成一个个对象,调用对象的方法或者属性来完成所需功能优点:易维护、易复用、易扩展。因为面向对象有封装、继承、多态的特性,所以可以设计

    2022年7月8日
    25
  • ios -特殊符号大全分享给大家,直接复制粘贴就可以使用了!

    ios -特殊符号大全分享给大家,直接复制粘贴就可以使用了!░▒▬♦◊◦♠♣▣۰•●❤●•۰►◄▧▨♨◐◑↔↕▪▫☼♦♧♡♂♀♠♣♥❤☜☞☎☏⊙◎☺☻☼▧▨♨◐◑↔↕▪▒◊◦▣▤▥▦▩◘◈◇♬♪♩♭♪の★☆→あぃ£Ю〓§♤♥▶¤๑⊹⊱⋛⋌⋚⊰⊹≈๑۩۩….۩۩๑๑۩۞۩๑✲❈✿✲❈➹~.~◕‿-。☀☂☁【】┱┲❣✚✪✣✤✥✦❉❥❦❧❃❂❁…

    2022年5月5日
    94
  • Python入门教程 超详细1小时学会Python

    Python入门教程 超详细1小时学会Python为什么使用Python假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200.思路:用shell编程.(Linux通常是ba

    2022年7月3日
    23

发表回复

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

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