Springboot 线程池
配置类
@Configuration
@EnableAsync
public class TaskPoolConfig {
@Bean("DacTaskExecutor")
public Executor taskExecutor(){
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(10);
taskExecutor.setMaxPoolSize(50);
taskExecutor.setQueueCapacity(200);
taskExecutor.setKeepAliveSeconds(60);
taskExecutor.setThreadNamePrefix("DacTaskExecutor--");
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
taskExecutor.setAwaitTerminationSeconds(60);
return taskExecutor;
}
}
执行线程中,如果有局部变量要使用 或者有外部值传入 新建thead 实现Callable接口 可以直接使用函数中的值的话使用lambda表达式,使用CompletionService进行调用
@Qualifier("DacTaskExecutor")
Executor threadPool;//注入线程池
class DoorStatusThread implements Callable<List<AcsDoorStatusDto>> {
String doors;
String opUserUuid;
public DoorStatusThread(String doors, String opUserUuid) {
this.doors = doors;
this.opUserUuid = opUserUuid;
}
@Override
public List<AcsDoorStatusDto> call() throws Exception {
return getAcsDoorStatus(opUserUuid, doors);
}
}
List<Future<List<AcsDoorStatusDto>>> futureList = Lists.newArrayList();
for (String s : collect) {
CompletionService<List<AcsDoorStatusDto>> completionService = new ExecutorCompletionService<>(threadPool);//使用线程池
DoorStatusThread task = new DoorStatusThread(s, opUserUuid);
futureList.add(completionService.submit(task));//提交任务
}
List<List<AcsDoorStatusDto>> allResultList = ThreadUtil.getExecuteResult(futureList);
//使用future get阻塞方法 获取 线程的返回值
public static <T> List<T> getExecuteResult(List<Future<T>> futureList) {
List<T> allResultList = Lists.newArrayList();
if (futureList==null ||futureList.isEmpty()) {
return allResultList;
}
//遍历返回结果
for (Future<T> future : futureList) {
try {
T result = future.get();
allResultList.add(result);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("Thread.currentThread().interrupt()",e);
} catch (ExecutionException e) {
log.error("Thread interrupt()",e);
}
}
return allResultList;
}