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

Java FutureTask類使用案例解析

 更新時間:2020年04月24日 15:33:02   作者:flydean程序那些事  
這篇文章主要介紹了Java FutureTask類使用案例解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值析,需要的朋友可以參考下

FutureTask一個可取消的異步計算,F(xiàn)utureTask 實現(xiàn)了Future的基本方法,提空 start cancel 操作,可以查詢計算是否已經(jīng)完成,并且可以獲取計算的結(jié)果。結(jié)果只可以在計算完成之后獲取,get方法會阻塞當計算沒有完成的時候,一旦計算已經(jīng)完成,那么計算就不能再次啟動或是取消。

一個FutureTask 可以用來包裝一個 Callable 或是一個runnable對象。因為FurtureTask實現(xiàn)了Runnable方法,所以一個 FutureTask可以提交(submit)給一個Excutor執(zhí)行(excution).

FutureTask是java 5引入的一個類,從名字可以看出來FutureTask既是一個Future,又是一個Task。

我們看下FutureTask的定義:

public class FutureTask<V> implements RunnableFuture<V> {
  ...
}
public interface RunnableFuture<V> extends Runnable, Future<V> {
  /**
   * Sets this Future to the result of its computation
   * unless it has been cancelled.
   */
  void run();
}

FutureTask實現(xiàn)了RunnableFuture接口,RunnableFuture接口是Runnable和Future的綜合體。

作為一個Future,F(xiàn)utureTask可以執(zhí)行異步計算,可以查看異步程序是否執(zhí)行完畢,并且可以開始和取消程序,并取得程序最終的執(zhí)行結(jié)果。

除此之外,F(xiàn)utureTask還提供了一個runAndReset()的方法, 該方法可以運行task并且重置Future的狀態(tài)。

Callable和Runnable的轉(zhuǎn)換
我們知道Callable是有返回值的,而Runnable是沒有返回值的。
Executors提供了很多有用的方法,將Runnable轉(zhuǎn)換為Callable:

  public static <T> Callable<T> callable(Runnable task, T result) {
    if (task == null)
      throw new NullPointerException();
    return new RunnableAdapter<T>(task, result);
  }

FutureTask內(nèi)部包含一個Callable,并且可以接受Callable和Runnable作為構(gòu)造函數(shù):

  public FutureTask(Callable<V> callable) {
    if (callable == null)
      throw new NullPointerException();
    this.callable = callable;
    this.state = NEW;    // ensure visibility of callable
  }
  public FutureTask(Runnable runnable, V result) {
    this.callable = Executors.callable(runnable, result);
    this.state = NEW;    // ensure visibility of callable
  }

它的內(nèi)部就是調(diào)用了Executors.callable(runnable, result);方法進行轉(zhuǎn)換的。

以Runnable運行

既然是一個Runnable,那么FutureTask就可以以線程的方式執(zhí)行,我們來看一個例子:

@Test
  public void convertRunnableToCallable() throws ExecutionException, InterruptedException {
    FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
      @Override
      public Integer call() throws Exception {
        log.info("inside callable future task ...");
        return 0;
      }
    });

    Thread thread= new Thread(futureTask);
    thread.start();
    log.info(futureTask.get().toString());
  }

上面例子是以單個線程來執(zhí)行的,同樣我們也可以將FutureTask提交給線程池來執(zhí)行:

  @Test
  public void workWithExecutorService() throws ExecutionException, InterruptedException {
    FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
      @Override
      public Integer call() throws Exception {
        log.info("inside futureTask");
        return 1;
      }
    });
    ExecutorService executor = Executors.newCachedThreadPool();
    executor.submit(futureTask);
    executor.shutdown();
    log.info(futureTask.get().toString());
  }

本文的例子可參考https://github.com/ddean2009/learn-java-concurrency/tree/master/futureTask

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

相關(guān)文章

  • java?Semaphore共享鎖實現(xiàn)原理解析

    java?Semaphore共享鎖實現(xiàn)原理解析

    這篇文章主要為大家介紹了Semaphore共享鎖實現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Java用list儲存,遍歷,查詢指定信息過程詳解

    Java用list儲存,遍歷,查詢指定信息過程詳解

    這篇文章主要介紹了Java用list儲存,遍歷,查詢指定信息過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java哈希表的概念及實現(xiàn)完整代碼

    Java哈希表的概念及實現(xiàn)完整代碼

    這篇文章主要介紹了Java哈希表的概念及實現(xiàn)的相關(guān)資料,哈希表是一種高效查找數(shù)據(jù)的結(jié)構(gòu),通過哈希函數(shù)將關(guān)鍵字映射到數(shù)組的索引位置,當發(fā)生沖突時,可以通過閉散列或開散列(鏈地址法)來解決,需要的朋友可以參考下
    2024-11-11
  • Java ArrayList與LinkedList及HashMap容器的用法區(qū)別

    Java ArrayList與LinkedList及HashMap容器的用法區(qū)別

    這篇文章主要介紹了Java ArrayList與LinkedList及HashMap容器的用法區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-07-07
  • 手把手教你搞懂冒泡排序和選擇排序

    手把手教你搞懂冒泡排序和選擇排序

    這篇文章主要介紹了java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • 基于多線程中join()的用法實例講解

    基于多線程中join()的用法實例講解

    下面小編就為大家?guī)硪黄诙嗑€程中join()的用法實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 在IDEA中 實現(xiàn)給main方法附帶參數(shù)的操作

    在IDEA中 實現(xiàn)給main方法附帶參數(shù)的操作

    這篇文章主要介紹了在IDEA中 實現(xiàn)給main方法附帶參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring中單例和多例的深入理解

    Spring中單例和多例的深入理解

    這篇文章主要介紹了Spring中單例和多例的深入理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JavaCV實戰(zhàn)之調(diào)用攝像頭基礎(chǔ)詳解

    JavaCV實戰(zhàn)之調(diào)用攝像頭基礎(chǔ)詳解

    這篇文章主要介紹了使用JavaCV框架對攝像頭進行各種處理的基礎(chǔ)理論詳解,文中的示例代碼講解詳細,對我們學習JavaCV有一定的幫助,需要的可以了解一下
    2022-01-01
  • 解決eclipse啟動tomcat時不能加載web項目的問題

    解決eclipse啟動tomcat時不能加載web項目的問題

    這篇文章主要介紹了解決eclipse啟動tomcat時不能加載web項目的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

积石山| 仙游县| 富裕县| 皋兰县| 澜沧| 五原县| 新巴尔虎左旗| 宁海县| 沾化县| 织金县| 兴文县| 祥云县| 沙河市| 和田市| 项城市| 焦作市| 大方县| 武义县| 观塘区| 共和县| 昌宁县| 崇州市| 浙江省| 保靖县| 德兴市| 云南省| 安泽县| 凯里市| 昭苏县| 绍兴县| 平江县| 白城市| 监利县| 墨脱县| 易门县| 玉龙| 高要市| 凤冈县| 榆林市| 威海市| 亚东县|