使用场景:需要同时创建多个线程去访问某一接口,并将返回数据进行组装
1. 创建ThreadPoolExecutor,切记创建在类的方法之外,这样就不会调用一次方法,创建一个ThreadPoolExecutor
private final static ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 30, 2000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(100));具体参数含义、原理、设置自行百度
2. 创建要执行任务的线程类
public class ExcuteTask implements Callable<BizResult<List<BudgetDTO>>> {
private BudgetForm form;
private BudgetService budgetService;
public ExcuteTask(BudgetForm form, BudgetService budgetService) {
this.form = form;
this.budgetService = budgetService;
}
@Override
public BizResult<List<BudgetDTO>> call() {
return budgetService.queryBudgetList(form);
}
}3.创建线程任务列表
List<Callable<BizResult<List<BudgetDTO>>>> taskGroup = Lists.newArrayList();
for (Integer currentPage = SECOND_PAGE; currentPage <= totalPageNum; currentPage++) {
BudgetForm queryForm = new BudgetForm();
BeanUtils.copyProperties(form, queryForm);
queryForm.setPageSize(MAX_PAGE_SIZE);
queryForm.setPageNo(currentPage);
//创建任务,并加入任务线程列表
ExcuteTask excuteTask = new ExcuteTask(queryForm, budgetService);
taskGroup.add(excuteTask);
}4.调用所有线程,并依次拿到执行结果进行汇总
List<Future<BizResult<List<BudgetDTO>>>> listFuture = executor.invokeAll(taskGroup);
for (Future<BizResult<List<BudgetDTO>>> future : listFuture) {
BizResult<List<BudgetDTO>> data = future.get();
if (null != data && data.isSuccess()) {
totalbudgetDTOGroup.addAll(data.getData());
} else {
//todo
}
} 本文是一个完整的使用案例,里面涉及到的都是自己的东西,经测过可以使用,但没有涉及到任何的线程池原理,如需这方面信息,可以咨询度娘or Google
Java ThreadPoolExecutor 实战指南

本文介绍了如何在Java中使用ThreadPoolExecutor进行多线程操作。通过创建线程池,实例化线程任务并执行,最后汇总执行结果,展示了线程池在并发访问接口时的应用。
1096





