ThreadPoolExecutor使用实例

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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.que
下面是一个使用 `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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值