美文网首页
组合式异步编程

组合式异步编程

作者: 上海马超23 | 来源:发表于2017-07-23 18:23 被阅读0次

构造同步和异步操作

// 定义线程池。第一个参数是线程池的大小,第2个参数是线程工厂
Executor executor = Executors.newFixedThreadPool(Math.min(shops.size(), 100), new ThreadFactory() {
        // 线程工厂 ThreadFactory.newThread返回线程变量,参数Runnable定义了线程的业务逻辑
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t;
        }
    });

List<CompletableFuture<String>> priceFutures = shops.stream()
            // 异步方式调用shop.getPrice()方法,第二个参数executor是线程池
            .map(shop -> CompletableFuture.supplyAsync(() -> shop.getPrice(), executor))
            // thenApply 同步调用上一个流的结果,因为Quote::parse是本地方法耗时低,函数参数是个同步方法
            .map(future -> future.thenApply(Quote::parse))
            // thenCompose 异步调用上一个流的结果,参数函数要异步包装
            .map(future -> future.thenCompose(quote -> CompletableFuture.supplyAsync(
                () -> Shop.applyDiscount(quote), executor)))
            .collect(toList());

合并两个独立线程的任务

// 线程2的任务输入不依赖于线程1的任务输出,可以线程1执行的同时,线程2不用等待直接执行
CompletableFuture.supplyAsync(() -> shop.task1(xxx))
  .thenCombine(
    CompletableFuture.supplyAsync(
      () -> service.task2(xxx)),
    // 线程1和线程2的输出在第二个参数执行
    (result1, result2) -> ...
  );

响应事件

CompletableFuture[] futures =
            // thenApply方法不会等待上一个流所有结果都出来才开始处理,而是只要有一个结果出来就开始处理
            (CompletableFuture[])findPrices2(shops).map(f -> f.thenAccept(
               s -> System.out.println(s + "done in " +
            ((System.nanoTime() - start) / 1_000_000))))
            .toArray(size -> new CompletableFuture[size]);
        CompletableFuture.allOf(futures).join();
        System.out.println("end");

CompletableFuture.allOf(futures).join(); // 等待所有结果出来才往下走
CompletableFuture.anyOf(futures).join(); // 只要有一个结果出来就往下走

相关文章

  • 四、Java8编程

    重构 默认方法 Optional CompletableFuture:组合式异步编程 新的日期和时间API

  • CompletableFuture 组合式异步编程

    CompletableFuture 组合式异步编程 本节内容: 创建异步计算并获取计算结果. 使用非阻塞操作提升吞...

  • 组合式异步编程

    构造同步和异步操作 合并两个独立线程的任务 响应事件

  • 组合式异步编程

    背景 如果你想要在同一个CPU上执行几个松耦合的任务,同时防止因某个任务等待过长而阻塞线程的执行,那么你需要做的是...

  • 组合式异步编程

    Future 接口它建模了一种异步计算,返回一个执行运算结果的引用,当运算结束后,这个引用被返回给调用方。在Fut...

  • Java8笔记(6)

    Java8笔记(6) CompletableFuture:组合式异步编程 如果你的意图是实现并发,而非并行,或者你...

  • CompletableFuture 组合式异步编程

    CompletableFuture 是jdk1.8引入的一个新特性。 它主要是为了解决多个Future结果之间的依...

  • CompletableFuture 组合式异步编程

    最近学习dubbo 源码, 敲了些vertx 代码,觉得异步编程的风格是有多么的帅,lambda表达式写的美...

  • 6、CompletableFuture组合式异步编程

    github地址:https://github.com/WeidanLi/Java-jdk8-future 一、F...

  • JAVA语言系列:组合式异步编程

    1. 导论 同步API和异步API:同步/异步关注的是消息通知的机制。 同步:调用了某个方法,调用方在被调用方运行...

网友评论

      本文标题:组合式异步编程

      本文链接:https://www.haomeiwen.com/subject/cwrmkxtx.html