JDKCompletableFuture 使用case

该博客探讨了如何使用Java的CompletableFuture进行异步任务处理,并通过配置线程池来优化性能。示例代码展示了如何创建并行任务,模拟接口调用延迟,并通过allOf方法等待所有任务完成。同时,还实现了一个评估函数,根据编辑距离计算结果的相似度,并对结果进行排序。
摘要由CSDN通过智能技术生成
public class JDKCompletableFutureTest {
    private static ExecutorService executorService = new ThreadPoolExecutor(
            Config.get().getInt("engine.search.CompletableFuture.pool.core.size",
                    Runtime.getRuntime().availableProcessors() * 2),
            Config.get().getInt("engine.search.CompletableFuture.pool.max.size",
                    Runtime.getRuntime().availableProcessors() * 10),
            60L,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<Runnable>(Config.get().getInt(
                    "engine.executor.CompletableFuture.queue.size", 5000))
    );

    public static void main(String[] args) throws ExecutionException, InterruptedException {


        long time = System.currentTimeMillis();
        CompletableFuture<MarklandBean> f1 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(4000); // 模拟接口调用耗时1秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MarklandBean marklandBean = new MarklandBean();
            marklandBean.setName("人民广场大动静店");
            return marklandBean;
        }, executorService);
        CompletableFuture<MarklandBean> f2 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2500); // 模拟接口调用耗时1.5秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MarklandBean marklandBean = new MarklandBean();
            marklandBean.setName("人民广场动静分店");
            return marklandBean;
        });
        CompletableFuture<MarklandBean> f3 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(2900); // 模拟接口调用耗时0.6秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            MarklandBean marklandBean = new MarklandBean();
            marklandBean.setName("人广淞虹路分店");
            return marklandBean;
        });

        List<CompletableFuture<MarklandBean>> list = new ArrayList<>();
        list.add(f1);
        list.add(f2);
        list.add(f3);
        Thread.sleep(1200);
        CompletableFuture<Void> f4 = CompletableFuture.allOf(list.toArray(new CompletableFuture[]{}));

        String inputWord = "人民广场淞虹路分店";
        System.out.println("耗时1:" + (System.currentTimeMillis() - time));
        MarklandBean result = getMarklandBean(list, inputWord);
        System.out.println("耗时2:" + (System.currentTimeMillis() - time));
    }

    private static MarklandBean getMarklandBean(List<CompletableFuture<MarklandBean>> list, String inputWord) {
        list.forEach(f -> {
            try {
                System.out.println("异步结果:" + f.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        MarklandBean result = null;
        try {
            List<MarklandBean> results = list.stream().filter(it -> it != null).map(it -> {
                MarklandBean i = null;
                try {
                    i = it.get(1000, TimeUnit.MILLISECONDS);
                    i.setLat(evaluate(i.getName(), inputWord));
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return i;
            }).sorted(Comparator.comparing(MarklandBean::getLat).reversed()).collect(Collectors.toList());

            result = results.stream().findFirst().get();

            results.forEach(f -> {
                try {
                    System.out.println("排序后的结果是:" + f);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            System.out.println("最好的地标:" + result.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public static double evaluate(String a, String b) {
        if (a == null && b == null) {
            return 1f;
        }
        if (a == null || b == null) {
            return 0F;
        }
        int editDistance = StringUtils.getLevenshteinDistance(a, b);
        return 1 - ((double) editDistance / Math.max(a.length(), b.length()));
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值