先感谢原博主
文章链接:java用多线程来加快循环效率_java多线程执行循环_hl199612的博客-CSDN博客
主要代码如下
@Override
public PageInfo selectEnquiryAccountList(EnquiryAccount enquiryAccount) {
/* body格式获取分页*/
PageDomain jsonPageDomain = TableSupport.buildJsonPageRequest();
Integer pageNum = jsonPageDomain.getPageNum();
Integer pageSize = jsonPageDomain.getPageSize();
if(pageNum==null || pageSize==null){
throw new RuntimeException("未获取到分页参数值");
}
// 1. 开启分页
PageHelper.startPage(pageNum,pageSize);
List<EnquiryAccount> enquiryAccounts = enquiryMapper.selectEnquiryAccountList(enquiryAccount);
// 3. 这一步的作用主要是为了获取分页信息
PageInfo studentDoPageInfo = new PageInfo<>(enquiryAccounts);
List<EnquiryAccountDto> enquiryAccountDtoList = new ArrayList<>();
// 创建线程池
final ExecutorService executor = new ThreadPoolExecutor(10, 400,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build(), new ThreadPoolExecutor.AbortPolicy());
// 初始化计时器
CountDownLatch cdl = new CountDownLatch(enquiryAccounts.size());
for (EnquiryAccount enquiryAccount : enquiryAccounts) {
executor.submit(new Runnable() {
@Override
public void run() {
try {
// 逻辑处理代码段
}catch (Exception e){
e.printStackTrace();
}
// 闭锁-1
cdl.countDown();
}
});
}
// 调用闭锁的await()方法,该线程会被挂起,它会等待直到count值为0才继续执行
// 这样我们就能确保上面多线程都执行完了才走后续代码
try {
cdl.await();
//关闭线程池
executor.shutdown();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 6.这一步的作用是将封装后的列表放到分页对象中
studentDoPageInfo.setList(enquiryAccountDtoList);
return studentDoPageInfo;
}