最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8新的異步編程方式CompletableFuture實(shí)現(xiàn)

 更新時間:2019年04月04日 09:55:34   作者:will的猜想  
這篇文章主要介紹了Java8新的異步編程方式CompletableFuture實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一. Future

JDK 5引入了Future模式。Future接口是Java多線程Future模式的實(shí)現(xiàn),在java.util.concurrent包中,可以來進(jìn)行異步計(jì)算。

Future模式是多線程設(shè)計(jì)常用的一種設(shè)計(jì)模式。Future模式可以理解成:我有一個任務(wù),提交給了Future,F(xiàn)uture替我完成這個任務(wù)。期間我自己可以去做任何想做的事情。一段時間之后,我就便可以從Future那兒取出結(jié)果。

Future的接口很簡單,只有五個方法。

public interface Future<V> {
 
 boolean cancel(boolean mayInterruptIfRunning);
 
 boolean isCancelled();
 
 boolean isDone();
 
 V get() throws InterruptedException, ExecutionException;
 
 V get(long timeout, TimeUnit unit)
  throws InterruptedException, ExecutionException, TimeoutException;
}

Future接口的方法介紹如下:

  • boolean cancel (boolean mayInterruptIfRunning) 取消任務(wù)的執(zhí)行。參數(shù)指定是否立即中斷任務(wù)執(zhí)行,或者等等任務(wù)結(jié)束
  • boolean isCancelled () 任務(wù)是否已經(jīng)取消,任務(wù)正常完成前將其取消,則返回 true
  • boolean isDone () 任務(wù)是否已經(jīng)完成。需要注意的是如果任務(wù)正常終止、異?;蛉∠?,都將返回true
  • V get () throws InterruptedException, ExecutionException 等待任務(wù)執(zhí)行結(jié)束,然后獲得V類型的結(jié)果。InterruptedException 線程被中斷異常, ExecutionException任務(wù)執(zhí)行異常,如果任務(wù)被取消,還會拋出CancellationException
  • V get (long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException 同上面的get功能一樣,多了設(shè)置超時時間。參數(shù)timeout指定超時時間,uint指定時間的單位,在枚舉類TimeUnit中有相關(guān)的定義。如果計(jì) 算超時,將拋出TimeoutException

一般情況下,我們會結(jié)合Callable和Future一起使用,通過ExecutorService的submit方法執(zhí)行Callable,并返回Future。

  ExecutorService executor = Executors.newCachedThreadPool();
 
  Future<String> future = executor.submit(() -> { //Lambda 是一個 callable, 提交后便立即執(zhí)行,這里返回的是 FutureTask 實(shí)例
   System.out.println("running task");
   Thread.sleep(10000);
   return "return task";
  });
 
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
  }
 
  System.out.println("do something else"); //前面的的 Callable 在其他線程中運(yùn)行著,可以做一些其他的事情
 
  try {
   System.out.println(future.get()); //等待 future 的執(zhí)行結(jié)果,執(zhí)行完畢之后打印出來
  } catch (InterruptedException e) {
  } catch (ExecutionException e) {
 
  } finally {
   executor.shutdown();
  }

比起future.get(),其實(shí)更推薦使用get (long timeout, TimeUnit unit) 方法,設(shè)置了超時時間可以防止程序無限制的等待future的結(jié)果。

二. CompletableFuture介紹

2.1 Future模式的缺點(diǎn)

Future雖然可以實(shí)現(xiàn)獲取異步執(zhí)行結(jié)果的需求,但是它沒有提供通知的機(jī)制,我們無法得知Future什么時候完成。

要么使用阻塞,在future.get()的地方等待future返回的結(jié)果,這時又變成同步操作。要么使用isDone()輪詢地判斷Future是否完成,這樣會耗費(fèi)CPU的資源。

2.2 CompletableFuture介紹

Netty、Guava分別擴(kuò)展了Java 的 Future 接口,方便異步編程。

Java 8新增的CompletableFuture類正是吸收了所有Google Guava中ListenableFuture和SettableFuture的特征,還提供了其它強(qiáng)大的功能,讓Java擁有了完整的非阻塞編程模型:Future、Promise 和 Callback(在Java8之前,只有無Callback 的Future)。

CompletableFuture能夠?qū)⒒卣{(diào)放到與任務(wù)不同的線程中執(zhí)行,也能將回調(diào)作為繼續(xù)執(zhí)行的同步函數(shù),在與任務(wù)相同的線程中執(zhí)行。它避免了傳統(tǒng)回調(diào)最大的問題,那就是能夠?qū)⒖刂屏鞣蛛x到不同的事件處理器中。

CompletableFuture彌補(bǔ)了Future模式的缺點(diǎn)。在異步的任務(wù)完成后,需要用其結(jié)果繼續(xù)操作時,無需等待??梢灾苯油ㄟ^thenAccept、thenApply、thenCompose等方式將前面異步處理的結(jié)果交給另外一個異步事件處理線程來處理。

三. CompletableFuture特性

3.1 CompletableFuture的靜態(tài)工廠方法

方法名 描述
runAsync(Runnable runnable) 使用ForkJoinPool.commonPool()作為它的線程池執(zhí)行異步代碼。
runAsync(Runnable runnable, Executor executor) 使用指定的thread pool執(zhí)行異步代碼。
supplyAsync(Supplier<U> supplier) 使用ForkJoinPool.commonPool()作為它的線程池執(zhí)行異步代碼,異步操作有返回值
supplyAsync(Supplier<U> supplier, Executor executor) 使用指定的thread pool執(zhí)行異步代碼,異步操作有返回值

runAsync 和 supplyAsync 方法的區(qū)別是runAsync返回的CompletableFuture是沒有返回值的。    

 CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
      System.out.println("Hello");
    });
 
    try {
      future.get();
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }
 
    System.out.println("CompletableFuture");

而supplyAsync返回的CompletableFuture是由返回值的,下面的代碼打印了future的返回值。

    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
 
    try {
      System.out.println(future.get());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }
 
    System.out.println("CompletableFuture");

3.2 Completable

方法名 描述
complete(T t) 完成異步執(zhí)行,并返回future的結(jié)果
completeExceptionally(Throwable ex) 異步執(zhí)行不正常的結(jié)束

future.get()在等待執(zhí)行結(jié)果時,程序會一直block,如果此時調(diào)用complete(T t)會立即執(zhí)行。

    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
 
    future.complete("World");
 
    try {
      System.out.println(future.get());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }

執(zhí)行結(jié)果:

World

可以看到future調(diào)用complete(T t)會立即執(zhí)行。但是complete(T t)只能調(diào)用一次,后續(xù)的重復(fù)調(diào)用會失效。

如果future已經(jīng)執(zhí)行完畢能夠返回結(jié)果,此時再調(diào)用complete(T t)則會無效。

    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
 
    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
 
    future.complete("World");
 
    try {
      System.out.println(future.get());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }

執(zhí)行結(jié)果:

Hello

如果使用completeExceptionally(Throwable ex)則拋出一個異常,而不是一個成功的結(jié)果。

    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
 
    future.completeExceptionally(new Exception());
 
    try {
      System.out.println(future.get());
    } catch (InterruptedException e) {
      e.printStackTrace();
    } catch (ExecutionException e) {
      e.printStackTrace();
    }

執(zhí)行結(jié)果:

java.util.concurrent.ExecutionException: java.lang.Exception
...

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解JAVA Stream流

    詳解JAVA Stream流

    這篇文章主要介紹了JAVA Stream流的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • xxl-job如何濫用netty導(dǎo)致的問題及解決方案

    xxl-job如何濫用netty導(dǎo)致的問題及解決方案

    本篇文章講解xxl-job作為一款分布式任務(wù)調(diào)度系統(tǒng)是如何濫用netty的,導(dǎo)致了怎樣的后果以及如何修改源碼解決這些問題,netty作為一種高性能的網(wǎng)絡(luò)編程框架,十分受大家喜愛,今天就xxl-job濫用netty這一問題給大家詳細(xì)下,感興趣的朋友一起看看吧
    2021-05-05
  • Java 添加、替換、刪除PDF中的圖片的示例代碼

    Java 添加、替換、刪除PDF中的圖片的示例代碼

    這篇文章主要介紹了Java 添加、替換、刪除PDF中的圖片,本文通過示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • MyBatisPlus中@TableField注解的基本使用

    MyBatisPlus中@TableField注解的基本使用

    這篇文章主要介紹了MyBatisPlus中@TableField注解的基本使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java基于反射機(jī)制實(shí)現(xiàn)全部注解獲取的方法示例

    Java基于反射機(jī)制實(shí)現(xiàn)全部注解獲取的方法示例

    這篇文章主要介紹了Java基于反射機(jī)制實(shí)現(xiàn)全部注解獲取的方法,結(jié)合實(shí)例形式分析了java反射機(jī)制獲取注解的具體實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • Callable實(shí)現(xiàn)多線程步驟詳解

    Callable實(shí)現(xiàn)多線程步驟詳解

    這篇文章主要介紹了Callable實(shí)現(xiàn)多線程步驟詳解,Callable是一個接口,用于實(shí)現(xiàn)多線程,與實(shí)現(xiàn)Runnable類似,但是功能更強(qiáng)大,該方法可以在任務(wù)結(jié)束后提供一個返回值,需要的朋友可以參考下
    2023-10-10
  • Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記

    Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記

    對于正則這個東西,對我來說一直是很懵逼的,每次用每次查,然后還是記不住,下面這篇文章主要給大家介紹了關(guān)于Java中@Pattern注解常用的校驗(yàn)正則表達(dá)式學(xué)習(xí)筆記的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Spring Data Jpa多表查詢返回自定義實(shí)體方式

    Spring Data Jpa多表查詢返回自定義實(shí)體方式

    這篇文章主要介紹了Spring Data Jpa多表查詢返回自定義實(shí)體方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot應(yīng)用的接口訪問從HTTP改為HTTPS

    SpringBoot應(yīng)用的接口訪問從HTTP改為HTTPS

    本文主要介紹了SpringBoot應(yīng)用的接口訪問從HTTP改為HTTPS,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Java并發(fā)CopyOnWrite容器原理解析

    Java并發(fā)CopyOnWrite容器原理解析

    這篇文章主要介紹了Java并發(fā)CopyOnWrite容器原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01

最新評論

新巴尔虎右旗| 阿拉善盟| 华宁县| 泗洪县| 鹤庆县| 武胜县| 彰化市| 大港区| 庄浪县| 保亭| 调兵山市| 政和县| 鹤壁市| 章丘市| 蓝田县| 肇庆市| 清丰县| 平顶山市| 湖州市| 调兵山市| 大港区| 曲阜市| 西盟| 甘泉县| 桦南县| 辽阳市| 昌江| 井冈山市| 南陵县| 伊川县| 广元市| 达日县| 鹤壁市| 政和县| 铅山县| 玉屏| 大新县| 那坡县| 渭南市| 定结县| 常州市|