ThreadPoolExecutor使用实例

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

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

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


下面是一个使用 `ThreadPoolExecutor` 和 `DiscardPolicy` 的示例: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class ThreadPoolExecutorDemo { public static void main(String[] args) { // 创建一个核心线程数为 2,最大线程数为 4,任务队列容量为 2 的线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 0L, TimeUnit.MILLISECONDS, new MyQueue<>(2), new ThreadPoolExecutor.DiscardPolicy()); // 提交 6 个任务,其中前 4 个任务会被执行,后 2 个任务会被丢弃 for (int i = 1; i <= 6; i++) { executor.submit(new MyTask(i)); } executor.shutdown(); } static class MyTask implements Runnable { private int taskId; MyTask(int taskId) { this.taskId = taskId; } @Override public void run() { System.out.println("Task #" + taskId + " is running on " + Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Task #" + taskId + " is completed."); } } static class MyQueue<E> extends java.util.concurrent.LinkedBlockingQueue<E> { MyQueue(int capacity) { super(capacity); } @Override public boolean offer(E e) { // 如果队列已满,则直接丢弃新任务 return super.offer(e) || remove(size() - 1); } } } ``` 在上面的示例中,我们创建了一个核心线程数为 2,最大线程数为 4,任务队列容量为 2 的线程池,并设置拒绝策略为 `DiscardPolicy`。 我们提交了 6 个任务,其中前 4 个任务会被执行,后 2 个任务会被丢弃。这是因为任务队列容量为 2,当任务队列已满时,会创建新的线程执行任务,但是最大线程数为 4,此时已经有 2 个线程在运行,因此只能创建 2 个新的线程,而新的任务又有 2 个,因此后面的 2 个任务没有办法被执行,而是被丢弃了。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值