package com.yyls.util;
import org.apache.skywalking.apm.toolkit.trace.CallableWrapper;
import org.apache.skywalking.apm.toolkit.trace.RunnableWrapper;
import java.util.concurrent.*;
/**
* 线程池工具类
*
* @author niuzhiwei
*/
public class ThreadPoolUtil {
volatile private static ThreadPoolExecutor threadPool = null;
/**
* 无返回值直接执行
*
* @param runnable
*/
public static void execute(Runnable runnable) {
getThreadPool().execute(RunnableWrapper.of(runnable));
}
/**
* 返回值直接执行
*
* @param callable
* @return
*/
public static <T> Future submit(Callable<T> callable) {
return getThreadPool().submit(CallableWrapper.of(callable));
}
private static ThreadPoolExecutor getThreadPool() {
if (threadPool != null) {
return threadPool;
} else {
synchronized (ThreadPoolUtil.class) {
if (threadPool == null) {
// 获取处理器数量
int cpuNum = Runtime.getRuntime().availableProcessors();
// 根据cpu数量,计算出合理的线程并发数
int threadNum = cpuNum * 2 + 1;
threadPool = new ThreadPoolExecutor(
threadNum - 1,
threadNum,
300,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(500),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
super.rejectedExecution(r, e);
}
}
);
}
}
}
return threadPool;
}
}
pom.xml加入
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>7.0.0</version>
</dependency>
示例:
ThreadPoolUtil.execute(() ->
cashRegisterService.updateOrderByOrderId(String.valueOf(findYyBackLiquorWriteOff.getAppointmentId()), "已核销"));