多线程异步查询月份并汇总结果

线程池配置

@Configuration
@EnableAsync
public class TaskExecutorConfig {
    /**
     * 异步处理线程
     * @return
     */
    @Bean(name = "screenTaskExecutor")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数:线程池创建时候初始化的线程数
        executor.setCorePoolSize(5);
        // 最大线程数:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(10);
        // 允许线程的空闲时间(秒):当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(600);
        // 设置线程名称
        executor.setThreadNamePrefix("Screen-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.initialize();
        return executor;
    }
}
@EnableAsync
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
controller
  @Autowired
   private Test test;

  @RequestMapping("/test1/find3")
    public String find23() throws InterruptedException, ExecutionException {
        //循环查询9个月的汇总数据
        //开始时间
        long start = System.currentTimeMillis();
        //9个月循环9次
        int month = 9;
        List<Integer> all  = new ArrayList<>();
        //阻塞队列 存每个线程获取的 Future 数据
        BlockingQueue<Future<List<Integer>>> queue = new LinkedBlockingQueue();
        CountDownLatch countDownLatch = new CountDownLatch(month);
        Random random = new Random();
        for (int i = 1; i <= month; i++) {
            System.out.println("月份"+i+"查询开始时间"+System.currentTimeMillis());
            //模拟db查询需要时间
            Long time = Long.parseLong(String.valueOf((random.nextInt(90)+10)*100));
            Future<List<Integer>> list = test.getList(countDownLatch,time);
            queue.add(list);
        }
        countDownLatch.await();
        /* 汇总结果 */
        for(Future<List<Integer>> future : queue) {
            List<Integer> list = future.get();
            all.addAll(list);
        }
        System.out.println("结果="+all);
        long cost = System.currentTimeMillis() - start;
        String logStr = String.format("查询耗时: %s ms",  cost);
        System.out.println(logStr);
        return logStr;
    }
service

@Service
public class Test {
    private static Random random = new Random();
    @Async("screenTaskExecutor")
    public Future<List<Integer>> getList(CountDownLatch countDownLatch,Long sui) throws InterruptedException {
        System.out.println("线程"+Thread.currentThread().getName()+"随机sleep时间 "+sui);
        List<Integer> list = new ArrayList<>();
        //[1,10]内的随机整数
        int n3 =random.nextInt(10)+1;
        for (int i = 0; i < n3; i++) {
            list.add(i);
        }
        // 1s - 9s 随机睡眠
        Thread.sleep(sui);
        countDownLatch.countDown();
        System.out.println(list);
        return  new AsyncResult<List<Integer>>(list);
    }
 }

结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用多线程异步处理任务集中统一处理结果的方式有很多,其中比较常用的方式是使用线程池和Future对象。 1. 线程池:Java提供了Executor框架,可以通过创建线程池来管理多个线程。你可以使用ThreadPoolExecutor类来创建一个线程池,并将任务提交给线程池进行执行。通过使用线程池,你可以控制并发线程的数量,避免创建过多的线程导致资源浪费。当所有任务执行完成后,你可以通过线程池的回调机制来处理任务的结果。 2. Future对象:Future是Java提供的一个接口,它表示一个异步计算的结果。你可以通过ExecutorService.submit()方法提交一个任务,并返回一个Future对象。通过Future对象,你可以检查任务是否完成、取消任务的执行、获取任务的执行结果等。当所有任务都提交完成后,你可以遍历Future对象集合,获取每个任务的执行结果,并进行统一处理。 下面是一个示例代码,演示了如何使用线程池和Future对象来实现多线程异步处理任务集中统一处理结果: ```java import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; public class AsyncTaskProcessor { public static void main(String[] args) { // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(5); // 创建任务列表 List<Callable<Integer>> tasks = new ArrayList<>(); tasks.add(new Task(1)); tasks.add(new Task(2)); tasks.add(new Task(3)); try { // 提交任务并获取Future对象列表 List<Future<Integer>> futures = executor.invokeAll(tasks); // 处理任务结果 for (Future<Integer> future : futures) { if (future.isDone()) { int result = future.get(); System.out.println("Task result: " + result); // 统一处理任务结果 // ... } } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } // 关闭线程池 executor.shutdown(); } static class Task implements Callable<Integer> { private int taskId; public Task(int taskId) { this.taskId = taskId; } @Override public Integer call() throws Exception { // 执行任务逻辑 Thread.sleep(1000); return taskId * 10; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值