线程池参数动态调整

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

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

线程池的参数动态调整

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


相关推荐

  • 浅析Promise用法[通俗易懂]

    浅析Promise用法[通俗易懂]浅析Promise用法要理解Promise要知道没有Promise的回调地狱如何插入一段漂亮的代码片Promise语法与then的用法所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。Promis…

    2022年6月19日
    24
  • ubuntu16.04重启网络服务命令_ubuntu重启服务器命令

    ubuntu16.04重启网络服务命令_ubuntu重启服务器命令在更改网络配置后,我们需要重启网络服务使更改生效。在centos系统中,我们可以通过以下命令重启网络服务:/etc/init.d/networkrestart#orservicenetworkrestartUbuntu14.04重启网络服务无效:servicenetworkingrestartstop:Jobfailedwhilestoppingstart:Jobi

    2022年10月9日
    0
  • 来自科学网博主的问候

    来自科学网博主的问候

    2021年8月24日
    49
  • 多态性_dna多态性的四个类型

    多态性_dna多态性的四个类型多态性的重要性:多态性是面向对象程序设计的一个强大机制:为名称相同的方法提供不同的实现方式,继承自同一基类的不同派生类可以为同名方法定义不同的功能,统一方法作用于不同类的对象,可以有不同的解释,产生

    2022年8月4日
    5
  • Hibernate中Longtext 映射到数据库

    Hibernate中Longtext 映射到数据库Hibernate中Longtext映射到数据库

    2022年5月14日
    45
  • PostgreSQL查询全角字符「建议收藏」

    PostgreSQL查询全角字符「建议收藏」PostgreSQL中~*的妙用PostgreSQL中可以使用~*进行模糊查询,同时会忽略大小写,在查询的条件中也会支持正则表达式。所以在查询全角字符的时候,可以使用正则表达式来来进行查询。select*from表名where字段~*'[A-Za-z0-9]’;使用上面SQL就可以查询出数据库中所有包含全角字符的数据了。…

    2025年6月5日
    0

发表回复

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

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