默认的使用
static ScheduledThreadPoolExecutorDynamic scheduledExecutorService = new ScheduledThreadPoolExecutorDynamic(2 * Runtime.getRuntime().availableProcessors());
但是当创建定时任务超过corepoolsize的大小后,会将任务添加到等待阻塞队列,我需要的是线程数动态跟任务数一致...
扩展子类代码:
package com.xxx.kafka.service.schedule;
import java.util.concurrent.*;
/**
* <Description>
* 动态定时任务线程池
* @author CJJ
* @version 1.0
* @createDate 2020/01/12 1:15
*/
public class ScheduledThreadPoolExecutorDynamic extends ScheduledThreadPoolExecutor {
public ScheduledThreadPoolExecutorDynamic(int corePoolSize) {
super(corePoolSize);
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
dynamicCorePoolSize(this);
return super.scheduleAtFixedRate(command, initialDelay, period, unit);
}
private static void dynamicCorePoolSize(ScheduledThreadPoolExecutor scheduledThreadPoolExecutor) {
int activeCount = scheduledThreadPoolExecutor.getActiveCount();
int corePoolSize = scheduledThreadPoolExecutor.getCorePoolSize();
if (activeCount == corePoolSize) {
scheduledThreadPoolExecutor.setCorePoolSize(corePoolSize + 1);
} else if (activeCount < corePoolSize - 1) {
scheduledThreadPoolExecutor.setCorePoolSize(corePoolSize - 1);
}
}
public boolean cancelSchedule(ScheduledFuture scheduledFuture) {
if (scheduledFuture != null && !scheduledFuture.isCancelled()) {
scheduledFuture.cancel(true);
this.setCorePoolSize(this.getCorePoolSize() - 1);
return true;
}
return false;
}
}