现实应用中重要有下列参数可以支持动态修改。
线程池参数分析corePoolSize焦点线程数maximumPoolSize最大线程数queueCapacity等候队列巨细timeout使命超时时间告警阈值execTimeout使命实行超时时间告警阈值queuedTaskWarningSize等候队列列队数量告警阈值checkInterval线程池定时监控时间隔断autoExtend是否主动扩容此中的corePoolSize、maximumPoolSize都可以使用ThreadPoolExecutor提供的api实现: public void setCorePoolSize(int corePoolSize) public void setMaximumPoolSize(int maximumPoolSize)
从ThreadPoolExecutor源码中可知, 设置新的焦点线程数时, 假如设置的新值小于当前值,多余的现有线程将在下一次空闲时停止,假如新设置的corePoolSize值更大,将在须要时启动新线程来实行任何列队的使命; 设置新的最大线程数时,假如新值小于当前值,多余的现有线程将在下一次空闲时停止。
ThreadPoolExecutor没有提供直接修改等候队列巨细的api。这就须要我们自界说一个可以修改容量的队列。其实很简单,只要把jdk原生的队列中的容量设置为可以修改,并提供修改方法即可。 比如把jdk中的LinkedBlockingQueue拷贝一份,定名为CapacityResizableLinkedBlockingQueue。 将其capacity的属性变为可变的,并提供set方法:
/** The capacity bound, or Integer.MAX_VALUE if none */private final int capacity;将上述原生代码改为:private volatile int capacity;public void setCapacity(int capacity) { this.capacity = capacity;}3.2 设置监听