多线程工具
工具类
public class SupplyAsyncUtils {
public static synchronized void supplyAsyncUploadingGX(List<CompletableFuture<?>> futures) {
CompletableFuture<Void> result = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
try {
result.join();
} catch (Exception e) {
e.printStackTrace();
}
}
public static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
}
线程池配置
@Slf4j
@EnableAsync
@Configuration
public class ExecutorConfig {
private static ExecutorConfig executorConfig;
private static int CORE_POOL_SIZE = 10;
private static int MAX_POOL_SIZE = 20;
private static int QUEUE_CAPACITY = 1000;
public ExecutorConfig setCorePoolSize(Integer corePoolSize) {
CORE_POOL_SIZE = corePoolSize;
return this.getExecutorConfig();
}
public ExecutorConfig setMaxPoolSize(Integer queueCapacity) {
MAX_POOL_SIZE = queueCapacity;
return this.getExecutorConfig();
}
public ExecutorConfig setQueueCapacity(Integer queueCapacity) {
QUEUE_CAPACITY = queueCapacity;
return this.getExecutorConfig();
}
public static ExecutorConfig getExecutorConfig() {
if (null == executorConfig) {
synchronized (ExecutorConfig.class) {
if (null == executorConfig) {
return executorConfig = SpringUtil.getBean(ExecutorConfig.class);
}
}
}
return executorConfig;
}
@Bean
public Executor asyncServiceExecutor() {
log.info("start asyncServiceExecutor");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(CORE_POOL_SIZE);
executor.setMaxPoolSize(MAX_POOL_SIZE);
executor.setQueueCapacity(QUEUE_CAPACITY);
executor.setThreadNamePrefix("async-service-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
调用 (有返回)
HashMap<String, Object> collectMap = new HashMap<>();
List<CompletableFuture<?>> futures = new ArrayList<>();
futures.add(CompletableFuture.supplyAsync(() -> {
try {
for (AgedExaminationBeanEnum agedExaminationBeanEnum : AgedExaminationBeanEnum.values()) {
IAgedExaminationReport agedExaminationBean = strategyBean.getAgedExaminationBean(agedExaminationBeanEnum);
HashMap<String, Object> examinationReportMap = agedExaminationBean.examinationReport(agedExaminationReportParam);
if (null != examinationReportMap) {
collectMap.putAll(examinationReportMap);
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("FileController-agedExaminationReport异常:{}", e.getMessage());
}
return null;
}, ExecutorConfig.getExecutorConfig().asyncServiceExecutor()));
SupplyAsyncUtils.supplyAsyncUploadingGX(futures);