CompletableFuture 并行及串行

public class Main {
    public static void main(String[] args) throws Exception {
        // 两个CompletableFuture执行异步查询:
        CompletableFuture<String> cfQueryFromSina = CompletableFuture.supplyAsync(() -> {
            return queryCode("中国石油", "https://finance.sina.com.cn/code/");
        });
        CompletableFuture<String> cfQueryFrom163 = CompletableFuture.supplyAsync(() -> {
            return queryCode("中国石油", "https://money.163.com/code/");
        });

        // 用anyOf合并为一个新的CompletableFuture:
        CompletableFuture<Object> cfQuery = CompletableFuture.anyOf(cfQueryFromSina, cfQueryFrom163);

        // 两个CompletableFuture执行异步查询:
        CompletableFuture<Double> cfFetchFromSina = cfQuery.thenApplyAsync((code) -> {
            return fetchPrice((String) code, "https://finance.sina.com.cn/price/");
        });
        CompletableFuture<Double> cfFetchFrom163 = cfQuery.thenApplyAsync((code) -> {
            return fetchPrice((String) code, "https://money.163.com/price/");
        });

        // 用anyOf合并为一个新的CompletableFuture:
        CompletableFuture<Object> cfFetch = CompletableFuture.anyOf(cfFetchFromSina, cfFetchFrom163);

        // 最终结果:
        cfFetch.thenAccept((result) -> {
            System.out.println("price: " + result);
        });
        // 主线程不要立刻结束,否则CompletableFuture默认使用的线程池会立刻关闭:
        Thread.sleep(200);
    }

    static String queryCode(String name, String url) {
        System.out.println("query code from " + url + "...");
        try {
            Thread.sleep((long) (Math.random() * 100));
        } catch (InterruptedException e) {
        }
        return "601857";
    }

    static Double fetchPrice(String code, String url) {
        System.out.println("query price from " + url + "...");
        try {
            Thread.sleep((long) (Math.random() * 100));
        } catch (InterruptedException e) {
        }
        return 5 + Math.random() * 20;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CompletableFuture是Java 8引入的一种异步编程工具,它可以帮助我们更方便地处理异步任务和并发操作。下面是一些玩转CompletableFuture的方法和技巧: 1. 创建CompletableFuture对象:可以使用CompletableFuture的静态工厂方法,比如CompletableFuture.supplyAsync()创建一个带有返回值的CompletableFuture对象,CompletableFuture.runAsync()创建一个不带返回值的CompletableFuture对象。 2. 组合多个CompletableFuture:可以使用thenCompose()方法将多个CompletableFuture进行串行组合,也可以使用thenCombine()方法将多个CompletableFuture进行并行组合。 3. 异常处理:使用exceptionally()方法可以在CompletableFuture发生异常时进行处理,使用handle()方法可以对异常进行处理并返回一个默认值。 4. 超时处理:使用orTimeout()方法可以设置CompletableFuture的超时时间,如果在指定时间内任务没有完成,则会抛出TimeoutException。 5. 并行处理:使用allOf()方法可以并行执行多个CompletableFuture,并等待它们全部完成。 6. 异步回调:可以使用whenComplete()、handle()、exceptionally()等方法来注册异步回调函数,在任务完成时执行相应的操作。 7. 取消任务:使用completeExceptionally()方法可以取消CompletableFuture任务的执行。 这些只是CompletableFuture的一些常见用法和技巧,你可以根据具体的需求进一步探索和玩转CompletableFuture。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值