CompletableFuture与ForkJoinPool

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 详解(一):基本概念及用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值