java 枚举,反射,CompletableFuture组合实现异步运算

当需要对一组数据进行不同维度的分析时,可使用该方法实现。
我这里简单的举例,实际遇到的场景不会这么简单:
给定两个整数,起始数字,结束数字,根据不同的业务规则,进行运算。
规则1:统计两个数之间的整数之和;
规则2:统计两个数之间的偶数;

根据上面的描述可知满足“对一组数据进行不同维度的分析”,所以可以使用CompletableFuture进行异步运算。
现在开始代码实现
创建各个实现类,实现业务规则:
创建CalcSum.java,实现规则1:

public class CalcSum implements Runnable {
    int startNum;
    int endNum;

    public CalcSum(int startNum, int endNum) {
        this.startNum = startNum;
        this.endNum = endNum;
    }

    @Override
    public void run() {
        System.out.println("Start Calculate.....");
        if (startNum > endNum) {
            System.out.println("error:endNum < startNum.");
        }
        int sum = 0;
        for (int i = startNum; i <= endNum; i++) {
            sum += i;
        }
        System.out.println("End Calculate.....,sum = " + sum);
    }
}

创建FindEvenNum.java,实现规则2:

public class FindEvenNum implements Runnable {
    int startNum;
    int endNum;

    public FindEvenNum(int startNum, int endNum) {
        this.startNum = startNum;
        this.endNum = endNum;
    }

    @Override
    public void run() {
        System.out.println("Start FindEvenNum.....");
        if (startNum > endNum) {
            System.out.println("error:endNum < startNum.");
        }
        List<Integer> evenNum = new ArrayList<>();
        for (int i = startNum; i <= endNum; i++) {
            if (i % 2 == 0) {
                evenNum.add(i);
            }
        }
        System.out.println("End FindEvenNum....." + evenNum);
    }
}

将业务实现类放进枚举类中:

public enum RunEnum {
    AAA(1, FindEvenNum.class),
    BBB(2, CalcSum.class);
    private final int index;
    private final Class<?> runClass;

    RunEnum(int index, Class<?> runClass) {
        this.index = index;
        this.runClass = runClass;
    }

    public static List<Class<?>> getAllRunClass() {
        List<Class<?>> list = new ArrayList<>();
        list.add(RunEnum.AAA.runClass);
        list.add(RunEnum.BBB.runClass);
        return list;
    }
}

使用反射获取实现类实例,并用CompletableFuture异步执行。

public class CompletableFutureDemo {
    public static void CompletableFutureCoordinateEnum(){
        ForkJoinPool pool = new ForkJoinPool();
        List<CompletableFuture<Void>> futureList = new ArrayList<>();
        List<Class<?>> allRunClass = RunEnum.getAllRunClass();
        allRunClass.forEach(runClass -> {
            try {
                Constructor<?> constructor = runClass.getConstructor(int.class, int.class);
                Object instance = constructor.newInstance(1, 20);
                CompletableFuture<Void> future = CompletableFuture.runAsync((Runnable) instance, pool);
                futureList.add(future);
            } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                e.printStackTrace();
            }
            System.out.println(runClass.getName());
        });
        futureList.forEach(future -> {
            try {
                future.get();
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        });
    }
    
    public static void main(String[] a){
        CompletableFutureCoordinateEnum();
    }
}

执行main方法,执行结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值