public class SinkServiceExecutor {
/**
* 线程池核心池的大小
*/
private static final int CORE_POOL_SIZE = 5;
/**
* 线程池的最大线程数
*/
private static final int MAXIMUM_POOL_SIZE = 8;
/**
* 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
*/
private static final long KEEP_ALIVE_TIME = 1;
/**
* keepAliveTime 的时间单位
*/
private static final TimeUnit TIME_UNIT = TimeUnit.SECONDS;
/**
* 用来储存等待执行任务的队列
*/
private static final BlockingQueue<Runnable> WORK_QUEUE = new LinkedBlockingDeque<>(10);
/**
* 拒绝策略
*/
private static final RejectedExecutionHandler HANDLER = new ThreadPoolExecutor.CallerRunsPolicy();
/**
* 创建线程池
*/
private static final ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAXIMUM_POOL_SIZE,
KEEP_ALIVE_TIME,
TIME_UNIT,
WORK_QUEUE,
HANDLER
);
/**
* 使用执行器
*/
private static final ExecutorService EXEC = THREAD_POOL_EXECUTOR;
public static void submit(Runnable task) {
EXEC.submit(task);
}
public static boolean getPoolQueueIsFull() {
int capacity = THREAD_POOL_EXECUTOR.getQueue().remainingCapacity();
if (capacity == 0) {
// 说明队列已满
return true;
} else {
return false;
}
}
public static BlockingQueue<Runnable> getPoolQueue() {
return THREAD_POOL_EXECUTOR.getQueue();
}
}
调用方式
if (sinkDbSign) {
// 数据放入队列
while (SinkServiceExecutor.getPoolQueueIsFull()) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
SinkServiceExecutor.submit(new Runnable() {
@Override
public void run() {
try {
umelogger.info("开始进行数据落库 " + JSONObject.toJSONString(bean));
allActivityDataServiceService.update(bean);
umelogger.info("数据落库完成");
} catch (Exception e) {
log.error("调用落库update接口异常 " + JSONObject.toJSONString(bean));
}
}
});
}
拒绝策略:拒绝策略中有四种: CallerRunsPolicy是阻塞等待