1、自定义线程
task.pool.corePoolSize=8
task.pool.maxPoolSize=32
task.pool.keepAliveSeconds=300
task.pool.queueCapacity=3000
@ConfigurationProperties(prefix = "task.pool")
@Component
@Data
public class TaskThreadPoolConfig {
/**
* 核心线程数
*/
private int corePoolSize;
/**
* 最大线程数
*/
private int maxPoolSize;
/**
* 过期时间
*/
private int keepAliveSeconds;
/**
* 阻塞队列
*/
private int queueCapacity;
}
2、线程池变成bean
@Configuration
public class MyTaskExecutePool {
@Primary
@Bean(name = "threadPoolTaskExecutorTwo")
public ThreadPoolTaskExecutor threadPoolTaskExecutorTwo(TaskThreadPoolConfig taskThreadPoolConfig) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(taskThreadPoolConfig.getMaxPoolSize());
executor.setCorePoolSize(taskThreadPoolConfig.getCorePoolSize());
executor.setQueueCapacity(taskThreadPoolConfig.getQueueCapacity());
executor.setKeepAliveSeconds(taskThreadPoolConfig.getKeepAliveSeconds());
// 线程池对拒绝任务(无线程可用)的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
3、使用CompletableFuture线程异步(例子)
@Autowired
private ThreadPoolTaskExecutor executor;
public ProjectDraftSaveVO getSpecificProjectDetail(String projectId) {
Long start = System.currentTimeMillis();
System.out.println("开始时间" + String.valueOf(start)+"projectId="+projectId);
//创建线程执行list
List<CompletableFuture> completableFutureList = Collections.synchronizedList(new LinkedList<>());
ProjectDraftSaveVO projectSaveVO = new ProjectDraftSaveVO();
//开启多线程异步
CompletableFuture<ProjectDraftSaveVO> projectFuture = CompletableFuture.supplyAsync(() -> {
//项目基本信息
ProjectInfoDraft projectInfo = projectInfoDraftRepository.getById(projectId);
//设置项目信息
ProjectInfoDraftVO projectInfoVO = ProjectInfoDraftWrapper.build().entityVO(projectInfo);
//单据信息
OrderInfoDraft orderInfo = orderInfoDraftRepository.getById(projectInfo.getOrderBid());
projectSaveVO.setProjectInfoVO(projectInfoVO);
return projectSaveVO;
}, executor);
//获取上面线程得到的结果后再执行
completableFutureList.add(projectFuture.thenAcceptAsync((res)->{
ProjectInfoDraftVO projectInfoVO = res.getProjectInfoVO();
if (projectInfoVO.getProTypeCode().equals(ProjectType.MIDYEAR_FINANCE_MAKING.getKey())
|| projectInfoVO.getProTypeCode().equals(ProjectType.FINANCE_MAKING.getKey())) {
GovBgtDraft govBgt = new GovBgtDraft();
govBgt.setFiscalYear(projectInfoVO.getFiscalYear());
govBgt.setProId(projectId);
govBgt.setIsDelete(2);
govBgt.setIncomeManageStruCode("001");
List<GovBgtDraftVO> govBgtVOList = GovBgtDraftWrapper.build()
.listVO(govBgtDraftRepository.list(Condition.getQueryWrapper(govBgt)));
//前端的还是批复金额,针对改一下
if (CollectionUtil.isNotEmpty(govBgtVOList)) {
//还是改回批复金额 无论年中年初都算入批复
// projectInfoVO.setBgtGovChildren(govBgtVOList);
// projectInfoVO.setIsYearAdd(govBgtVOList.get(0).getIsYearAdd());
//有新值,重新赋值
projectSaveVO.setProjectInfoVO(projectInfoVO);
}
}
},executor));
completableFutureList.add(CompletableFuture.runAsync(()->{
//不需等待结果直接执行其他
},executor));
//所有线程方法执行完
try {
CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()])).get();
} catch (Exception e) {
e.printStackTrace();
}
return projectSaveVO;
}