ThreadPoolExecutor使用实例

使用场景:需要同时创建多个线程去访问某一接口,并将返回数据进行组装

1. 创建ThreadPoolExecutor,切记创建在类的方法之外,这样就不会调用一次方法,创建一个ThreadPoolExecutor

private final static ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 30, 2000, TimeUnit.MILLISECONDS,new ArrayBlockingQueue(100));

具体参数含义、原理、设置自行百度

2. 创建要执行任务的线程类

 public class ExcuteTask implements Callable>> {
    private BudgetForm form;
    private BudgetService budgetService;

    public ExcuteTask(BudgetForm form, BudgetService budgetService) {
        this.form = form;
        this.budgetService = budgetService;
    }

    @Override
    public BizResult> call() {
        return budgetService.queryBudgetList(form);
    }
}

3.创建线程任务列表

   List>>> 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>>> listFuture = executor.invokeAll(taskGroup);
   for (Future>> future : listFuture) {
	    BizResult> data = future.get();
	    if (null != data && data.isSuccess()) {
	        totalbudgetDTOGroup.addAll(data.getData());
	    } else {
	     //todo
	    }
   }
  本文是一个完整的使用案例,里面涉及到的都是自己的东西,经测过可以使用,但没有涉及到任何的线程池原理,如需这方面信息,可以咨询度娘or Google


你可能感兴趣的:(语言,高并发)