最近项目上用到了线程池,自己手写了一个ThreadPoolTaskExecutor线程池样例。
配置类
配置类根据自己的服务器参数自行配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 线程池配置类 根据自己环境进行配置
*/
@Configuration
public class ExecutorConfig {
/**
* 核心线程数 自行设置
*/
private static final int CORE_POOL_SIZE = 15;
/**
* 最大线程数 自行设置
*/
private static final int MAX_POOL_SIZE = CORE_POOL_SIZE * 2 + 1;
@Bean(name="taskExecutor")
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
/**
* 此方法返回可用处理器的虚拟机的最大数量; 不小于1
* int core = Runtime.getRuntime().availableProcessors();
*/
//设置核心线程数
poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
//设置最大线程数
poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
//除核心线程外的线程存活时间
poolTaskExecutor.setKeepAliveSeconds(3);
//如果传入值大于0,底层队列使用的是LinkedBlockingQueue,否则默认使用SynchronousQueue
poolTaskExecutor.setQueueCapacity(40);
//线程名称前缀
poolTaskExecutor.setThreadNamePrefix("thread-execute");
//设置拒绝策略
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return poolTaskExecutor;
}
}
使用样例
分别使用execute()和submit()方法举例,submit()方法有返回值
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @Author:
* @Description
* @Date: 下午5:14 2022/7/22
*/
@Component
public class ExecutorTest {
@Autowired
private ThreadPoolExecutor taskExecutor;
public void test() throws ExecutionException, InterruptedException {
//开始异步处理 无返回值
for (int i = 0; i < 10; i++) {
taskExecutor.execute(() -> {
//TODO 自己的业务代码
System.out.println("自行补充逻辑代码处");
});
}
//存储每个异步线程结果
List<Future> futureList = new ArrayList<>();
//开始异步处理 有返回值
for (int i = 0; i < 10; i++) {
Future<Double> future = taskExecutor.submit(new Callable<Double>() {
@Override
public Double call() throws Exception {
//TODO 自己的业务代码
System.out.println("自行补充逻辑代码处");
return 2.1;
}
});
futureList.add(future);
}
//阻塞获取异步执行后的返回值
for (Future future : futureList) {
Object o = future.get();
System.out.println(Double.valueOf(o.toString()));
}
}
}