JUC併發編程(十五)-異步回調:Futrue 的實現類CompletableFuture

15、異步回調:Futrue 的實現類CompletableFuture

概述

Futrue 設計初衷: 對將來會發生的結果進行建模~

程序的性能要高,要異步處理!同步並阻塞!

A 線程做完了返回一個結果告訴main我做完了!

Futrue就相當於ajax。

在這裏插入圖片描述

在這裏插入圖片描述

實例:CompletableFuture無返回結果情況測試

package com.interview.concurrent.completablefuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author yangxj
 * @description 描述
 * CompletableFuture 異步回調, 對將來的結果進行結果,ajax就是一種異步回調!
 * @date 2020/2/24 21:32
 */
public class CompletableFutureDemo {
    public static void main(String[] args) throws Exception {
        // 多線程也可以異步回調

        voidCompletableFuture();
    }

    /**
     *  @description: CompletableFuture 的 runAsync方法,沒有返回結果,任務執行完了就完畢了
     *  適用場景:插入數據,修改數據
     *  @author yangxj
     *  @date 2020/2/24 21:59
     */
    public static void voidCompletableFuture() throws ExecutionException, InterruptedException {
        CompletableFuture<Void> voidFuture = CompletableFuture.runAsync(() -> {
            System.out.println(Thread.currentThread().getName() + ":沒有返回結果");
        });
        System.out.println(voidFuture.get()); //null
    }
}

運行結果如下:

在這裏插入圖片描述

實例:CompletableFuture有返回結果情況測試

程序正常運行情況

package com.interview.concurrent.completablefuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author yangxj
 * @description 描述
 * CompletableFuture 異步回調, 對將來的結果進行結果,ajax就是一種異步回調!
 * @date 2020/2/24 21:32
 */
public class CompletableFutureDemo {
    public static void main(String[] args) throws Exception {
        // 多線程也可以異步回調

       returnCompletableFuture();
    }

    /**
     *  @description:有返回結果 ,功能像ajax。 成功或者失敗!
     *  適用場景:
     *  可異步執行的任務,並且這個任務要求有返回結果!
     *  @author yangxj
     *  @date 2020/2/24 22:01
     */
    public static void returnCompletableFuture() throws ExecutionException, InterruptedException {

        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "有返回結果");
            Integer result = 1024;
            return result;
        });

        System.out.println(integerCompletableFuture.whenComplete((ok, error) -> {
            System.out.println("===ok===" + ok); // 正常結果
            System.out.println("===error===" + error); // 錯誤結果
        }).exceptionally(e -> {// 異常!
            System.out.println("getMessage=>" + e.getMessage());
            return 555; // 異常返回結果
        }).get());
    }
}

程序運行結果如下:

在這裏插入圖片描述

設置程序異常情況:

package com.interview.concurrent.completablefuture;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
* @author yangxj
* @description 描述
* CompletableFuture 異步回調, 對將來的結果進行結果,ajax就是一種異步回調!
* @date 2020/2/24 21:32
*/
public class CompletableFutureDemo {
   public static void main(String[] args) throws Exception {
       // 多線程也可以異步回調

      returnCompletableFuture();
   }

   /**
    *  @description:有返回結果 ,功能像ajax。 成功或者失敗!
    *  適用場景:
    *  可異步執行的任務,並且這個任務要求有返回結果!
    *  @author yangxj
    *  @date 2020/2/24 22:01
    */
   public static void returnCompletableFuture() throws ExecutionException, InterruptedException {

       CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {
           System.out.println(Thread.currentThread().getName() + "有返回結果");
           int i = 10/0; //設置一個異常
           Integer result = 1024;
           return result;
       });

       System.out.println(integerCompletableFuture.whenComplete((ok, error) -> {
           System.out.println("===ok===" + ok); // 正常結果
           System.out.println("===error===" + error); // 錯誤結果
       }).exceptionally(e -> {// 異常!
           System.out.println("getMessage=>" + e.getMessage());
           return 555; // 異常返回結果
       }).get());
   }
}

程序運行結果如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章