1. 程式人生 > >Java8學習計劃--關於多核多執行緒併發程式設計-Java8-CompletableFuture 4的介紹

Java8學習計劃--關於多核多執行緒併發程式設計-Java8-CompletableFuture 4的介紹

零零散散接近一個月的課餘時間,學完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);
        }
    }
}