③. 对计算结果进行消费(thenAccept、thenRun)
- ③. 对计算结果进行消费
CompletableFuture.supplyAsync(() -> { return 1; }).thenApply(f -> { return f+2; }).thenApply(f -> { return f+3; }).thenAccept(r -> System.out.println(r)); // 任务A执行完执行B,并且B不需要A的结果 System.out.println(CompletableFuture.supplyAsync(() -> "resultA").thenRun(() -> {}).join()); // 任务A执行完成执行B,B需要A的结果,但是任务B无返回值 System.out.println(CompletableFuture.supplyAsync(() -> "resultA").thenAccept(resultA -> {}).join()); // 任务A执行完成执行B,B需要A的结果,同时任务B有返回值 System.out.println(CompletableFuture.supplyAsync(() -> "resultA").thenApply(resultA -> resultA + " resultB").join());
④. 对计算速度进行选用(applyToEither)
- ④. 对计算速度进行选用
//这个方法表示的是,谁快就用谁的结果,类似于我们在打跑得快,或者麻将谁赢了就返回给谁 //public <U> CompletableFuture<U> applyToEither(CompletionStage<? extends T> other, Function<? super T, U> fn); //下面这个在第一个中停留1s,在第二种停留2s,返回的结果是1 System.out.println(CompletableFuture.supplyAsync(() -> { //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) {e.printStackTrace();} return 1; }).applyToEither(CompletableFuture.supplyAsync(() -> { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) {e.printStackTrace();} return 2; }), r -> { return r; }).join()); //暂停几秒钟线程 try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }
⑤. 对计算结果进行合并(thenCombine)
- ⑤. 对计算结果进行合并
//public <U,V> CompletableFuture<V> thenCombine //(CompletionStage<? extends U> other,BiFunction<? super T,? super U,? extends V> fn) //两个CompletionStage任务都完成后,最终把两个任务的结果一起交给thenCombine来处理 //先完成的先等着,等待其他分支任务 System.out.println(CompletableFuture.supplyAsync(() -> { return 10; }).thenCombine(CompletableFuture.supplyAsync(() -> { return 20; }), (r1, r2) -> { return r1 + r2; }).thenCombine(CompletableFuture.supplyAsync(() -> { return 30; }), (r3, r4) -> { return r3 + r4; }).join()); System.out.println(CompletableFuture.supplyAsync(() -> { return 10; }).thenCombine(CompletableFuture.supplyAsync(() -> { return 20; }), (r1, r2) -> { return r1 + r2; }).join());