多个任务同同时异步处理+等待处理完毕

1.多个任务同时异步处理


// 设计线程池最大5个并发,其他进来排队
private ExecutorService executorPool = ThreadUtils.newDaemonFixedThreadPool(5,"APP-SCAN-THREAD");


private void commitAsyncScanRequests(List<CompletableFuture<List<AppHealthScanResult>>> futures, List<AppHealthRequest> requests) {
        for (AppHealthRequest request : requests) {
            CompletableFuture<List<AppHealthScanResult>> future = CompletableFuture.supplyAsync(
                    () -> getAppHealthScanResult(request), executorPool);
            futures.add(future);
        }
    }

2.等待结果处理完毕


 private void waitScanRequestComplete(List<CompletableFuture<List<AppHealthScanResult>>> futures) {
        log.info("应用健康度扫描等待所有扫描结果{}完成", futures.size());
        CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();
    }

3.获取多个任务的处理结果

private void writeScanResults(List<AppHealthScanResult> scanResults, List<CompletableFuture<List<AppHealthScanResult>>> futures) throws InterruptedException, ExecutionException {
        for (CompletableFuture<List<AppHealthScanResult>> future : futures) {
            scanResults.addAll(future.get());
        }
    }

4.所有逻辑组装起来

private BiConsumer<List<AppHealthRequest>,List<AppHealthScanResult>> appHealthCheckConsumer = new BiConsumer<List<AppHealthRequest>, List<AppHealthScanResult>>() {
        @SneakyThrows
        @Override
        public void accept(List<AppHealthRequest> requests, List<AppHealthScanResult> scanResults) {
            List<CompletableFuture<List<AppHealthScanResult>>> futures = Lists.newCopyOnWriteArrayList();
            // 提交异步扫描请求
            commitAsyncScanRequests(futures,requests);

            // 等待扫描完成
            waitScanRequestComplete(futures);

            // 获取扫描结果
            writeScanResults(scanResults,futures);
            log.info("应用健康度扫描所有扫描结果完成");
        }
    };
posted @   SpecialSpeculator  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示