Java8學習計劃--關於多核多執行緒併發程式設計-Java8-CompletableFuture 4的介紹
阿新 • • 發佈:2019-02-03
零零散散接近一個月的課餘時間,學完Java8InAction和Guava,感觸很多,收穫也很大,特別開心,接下來會利用空餘時間學習Spark,希望自己在技術上慢慢積累,越來越從容。
對於Java8 最大的改變是lambda表示式 Collecotors CompletableFutures等 Funtional Programing.的思想真的很強大
下面介紹Java8 CompletableFuture 4
* com.company.LambdaExpressions.Futures.CompletableFuture * 對CompletableFuture主要的API的使用 * 針對多個執行緒之間的通訊/執行緒等待/所有任務執行完成/部分執行緒任務執行完成 執行接下來的操作非常強大* 1.runAfterBoth 兩個執行緒都執行完後進行接下來的操作 * 2.acceptEither 兩個任務 誰先執行完 誰執行接下來的action或者consumer等 * 3.applyToEither 兩個任務 誰先執行完 誰執行Function 然後輸出等action * 4.runAfterEither 兩個任務 誰先執行完 誰執行接下來的action * 5.anyOf 任意一個任務執行完 do next action * 6.allOf 任意一個任務執行完 do next action
package com.company.LambdaExpressions.Futures.CompletableFuture; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.CompletableFuture; import static java.util.stream.Collectors.toList; /** * Created by mengxiaopeng on 2018/3/9. * com.company.LambdaExpressions.Futures.CompletableFuture * 對CompletableFuture主要的API的使用 * 針對多個執行緒之間的通訊/執行緒等待/所有任務執行完成/部分執行緒任務執行完成 執行接下來的操作非常強大 * 1.runAfterBoth 兩個執行緒都執行完後進行接下來的操作 * 2.acceptEither 兩個任務 誰先執行完 誰執行接下來的action或者consumer等 * 3.applyToEither 兩個任務 誰先執行完 誰執行Function 然後輸出等action * 4.runAfterEither 兩個任務 誰先執行完 誰執行接下來的action * 5.anyOf 任意一個任務執行完 do next action * 6.allOf 任意一個任務執行完 do next action * */ public class MyCompletableFutureInAction4 { private static Random random = new Random(); public static void main(String[] args) { //##runAfterBoth 當兩個執行緒都執行完畢後 進行一個Runnable的action //預設採用ForkJoin的pool來操作 CompletableFuture.supplyAsync( () -> { System.out.println(Thread.currentThread().getName() + " is running.."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } return 1; } ).runAfterBoth(CompletableFuture.supplyAsync( () -> { System.out.println(Thread.currentThread().getName() + " is running.."); return 2; } ), () -> System.out.println("Task1 and Task2 done")); //acceptEither 兩個任務 誰先執行完 誰執行Runnable的action CompletableFuture.supplyAsync(() -> { System.out.println("Iam future1"); return MyCompletableFutureInAction4.generateRandomDouble(); }) .acceptEither(CompletableFuture.supplyAsync( () -> { System.out.println("Iam future2"); return MyCompletableFutureInAction4.generateRandomDouble(); } ), System.out::println); //applyToEither 兩個任務 誰先執行完 誰執行Function 然後輸出等action CompletableFuture.supplyAsync(() -> { System.out.println("Iam future1"); return MyCompletableFutureInAction4.generateRandomDouble(); }) .applyToEither(CompletableFuture.supplyAsync( () -> { System.out.println("Iam future2"); return MyCompletableFutureInAction4.generateRandomDouble(); } ), v -> v * 100).thenAccept(System.out::println); //## runAfterEither 兩個任務 誰先執行完 誰執行Runnable的action CompletableFuture.supplyAsync(() -> { System.out.println("[runAfterEither] I am future1"); return MyCompletableFutureInAction4.generateRandomDouble(); }).runAfterEither(CompletableFuture.supplyAsync( () -> { System.out.println("[runAfterEither] Iam future2"); return MyCompletableFutureInAction4.generateRandomDouble(); } ), System.out::println); //## anyOf 任意一個執行完 可以進行接下來的操作 List<CompletableFuture<Double>> futures = Arrays.asList(1, 2, 3, 4) .stream() .map(i -> CompletableFuture.supplyAsync(MyCompletableFutureInAction4::generateRandomDoubleAnyOfAllOf)) .collect(toList()); CompletableFuture[] arrayFutures = futures.toArray(new CompletableFuture[futures.size()]); //anyOf(CompletableFuture<?>... cfs) cfs是陣列 /* CompletableFuture.anyOf(arrayFutures) .thenRun(()->{ System.out.println("[any Of Tasks] done.."); });*/ //## allOf 所有的執行完 //anyOf(CompletableFuture<?>... cfs) cfs是陣列 CompletableFuture.allOf(arrayFutures) .thenRun(()->{ System.out.println("[***all*** Of Tasks] done.."); }); //讓當前執行緒掛起 try { Thread.currentThread().join(); } catch (InterruptedException e) { e.printStackTrace(); } } public static Double generateRandomDouble() { try { Thread.sleep(1000); double value = random.nextDouble(); return value; } catch (InterruptedException e) { e.printStackTrace(); throw new RuntimeException(e); } } public static Double generateRandomDoubleAnyOfAllOf() { try { System.out.println("AnyOf or AllOf excutorStart"); Thread.sleep(random.nextInt(20)*1000); double value = random.nextDouble(); System.out.println("AnyOf or AllOf excutorEnd"); return value; } catch (InterruptedException e) { e.printStackTrace(); throw new RuntimeException(e); } } }