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;
}