0
点赞
收藏
分享

微信扫一扫

CompletableFuture与ForkJoinPool

自由的美人鱼 2022-04-13 阅读 76
java
package com.lyr.demo.controller;

import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author kaka
 * @date 2022/4/10 23:04
 **/
@Slf4j
public class CompletableFutureTestController {

    private static final ExecutorService executor = new ThreadPoolExecutor(1, 128,
            60L, TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(1),
            new ThreadPoolExecutor.CallerRunsPolicy());

    public static void main(String[] args) {

        List<Integer> testDataList = ListUtil.toList(1, 2, 3, 4, 5);

        CompletableFuture[] completableFutures = testDataList
                .stream()
                .map(testData -> CompletableFuture.supplyAsync(
                        () -> {
                            int i = RandomUtil.randomInt(3, 10);
                            log.info("线程池开始执行:{}",i);
                            ThreadUtil.sleep(i, TimeUnit.SECONDS);
                            ArrayList<String> strings = ListUtil.toList("我是:" + testData);
                            log.info("线程池执行结束:{}",i);
                            return strings;
                        }, executor)
                ).toArray(CompletableFuture[]::new);

        log.info("执行到这里了:{}", completableFutures);
        CompletableFuture.allOf(completableFutures).join();
        log.info("执行完毕:{}", completableFutures);

        List<String> lastStrings = Collections.synchronizedList(new ArrayList<>());
        for (CompletableFuture completableFuture : completableFutures) {

            completableFuture.whenComplete((testDatas, e) -> {
                log.info("获取到的testDatas:{}", testDatas);
                if (null != e) {
                    log.error("执行发生异常,异常信息:{}", e);
                    return;
                }
                if (testDatas instanceof List) {
                    lastStrings.addAll((List<String>) testDatas);
                }
            });
        }

        log.info("返回的数据:{}", lastStrings);
        executor.shutdown();
    }
}

参考:线程池ForkJoinPool简介
FORKJOINPOOL 分支合并框架
CompletableFuture 详解(一):基本概念及用法

举报

相关推荐

0 条评论