cn.hippo4j.starter.toolkit.thread.TaskQueue Maven / Gradle / Ivy
package cn.hippo4j.starter.toolkit.thread;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.TimeUnit;
/**
* Task queue.
*
* @author chen.ma
* @date 2021/7/5 21:00
*/
public class TaskQueue extends LinkedBlockingQueue {
private static final long serialVersionUID = -2635853580887179627L;
private FastThreadPoolExecutor executor;
public TaskQueue(int capacity) {
super(capacity);
}
public void setExecutor(FastThreadPoolExecutor exec) {
executor = exec;
}
@Override
public boolean offer(Runnable runnable) {
int currentPoolThreadSize = executor.getPoolSize();
// 如果有核心线程正在空闲, 将任务加入阻塞队列, 由核心线程进行处理任务
if (executor.getSubmittedTaskCount() < currentPoolThreadSize) {
return super.offer(runnable);
}
// 当前线程池线程数量小于最大线程数, 返回false, 根据线程池源码, 会创建非核心线程
if (currentPoolThreadSize < executor.getMaximumPoolSize()) {
return false;
}
// 如果当前线程池数量大于最大线程数, 任务加入阻塞队列
return super.offer(runnable);
}
public boolean retryOffer(Runnable o, long timeout, TimeUnit unit) throws InterruptedException {
if (executor.isShutdown()) {
throw new RejectedExecutionException("Actuator closed!");
}
return super.offer(o, timeout, unit);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy