Springboot自定义线程池,多线程遍历list及有返回值
自定义连接池
/**
* @description: 某功能公共线程池
* @author: zjq
* @create: 2021-01-06 15:35
**/
@Configuration
public class TranslationThreadPoolConfig {
// 核心线程池大小
private int corePoolSize = 20;
// 最大可创建的线程数
private int maxPoolSize = 50;
// 队列最大长度
private int queueCapacity = 1000;
// 线程池维护线程所允许的空闲时间
private int keepAliveSeconds = 300;
//线程名称前缀
private String threadNamePrefix="线程名称前缀";
@Primary
@Bean(name = "translationThreadPoolTaskExecutor")
public ThreadPoolTaskExecutor translationThreadPoolTaskExecutor()
{
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(maxPoolSize);
executor.setCorePoolSize(corePoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(keepAliveSeconds);
executor.setThreadNamePrefix(threadNamePrefix);
// 线程池对拒绝任务(无线程可用)的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
service层调用
1.serviceImpl其他代码忽略
2.依赖注入自定义线程池对象
@Autowired
@Qualifier("translationThreadPoolTaskExecutor")
private Executor executor;
3.方法调用
//需要多线程遍历的list
List<Map<String, Object>> waitSortBizDatas =new ArrayList(Map<String, Object>);
//多线程执行行转译
List<CompletableFuture<RuleResult>> collect = waitSortBizDatas.stream().map(waitSortBizData -> CompletableFuture.supplyAsync(() ->
//调用别的方法
iAccRuleService.ruleExecute(voucherLineId, ruleIds,bizTable.getTableCode(), waitSortBizData), executor)
).collect(Collectors.toList());
//获取返回值
List<RuleResult> list = collect.stream().map(CompletableFuture::join).collect(Collectors.toList());