欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java使用FutureTask實現預加載的示例詳解

 更新時間:2023年06月20日 11:45:50   作者:海塔燈  
基于FutureTask的特性,通??梢允褂肍utureTask做一些預加載工作,比如一些時間較長的計算等,本文就來和大家講講具體實現方法吧,感興趣的可以了解一下

FutureTask介紹

FutureTask也可以用作閉鎖;FutureTask的計算是通過Callable來實現的,相當于一種可生成結果的Runnable,并且可以處于3種狀態(tài),分別是等待運行(waiting to run)、正在運行(Running)、和運行完成(Completed),而運行完成表示計算的所有可能結束方式,包括正常結束,由于取消而結束由于異常而結束等,當FutureTask進入完成狀態(tài)后,它就會永遠停止在這個狀態(tài)上。我們可以使用Future.get()方法獲取任務執(zhí)行的狀態(tài)。

使用場景

Future.get的行為取決于任務的狀態(tài),如果任務已經完成,那么get會立即返回結果,否則get方法將阻塞直到任務進入完成狀態(tài),然后返回結果或者拋出異常,FutureTask將計算結果從執(zhí)行計算的線程傳遞到獲取這個結果的線程,而FutureTask的規(guī)范確保了這種傳遞過程能實現結果的正確性

基于FutureTask的特性,通??梢允褂肍utureTask做一些預加載工作,比如一些時間較長的計算,這些計算可以在使用計算結果之前啟動,并且計算的結果將在稍后是同,通過提前啟動計算,可以減少等待結果時需要的時間

實例解析

假設我們要加載一個產品信息,使用FutureTask來執(zhí)行一個高開銷的計算。代碼如下所示: 首先簡單寫一個產品的Bean類:

    static class ProductInfo {
        public ProductInfo(String name, String order_id) {
            this.name = name;
            this.order_id = order_id;
        }
        private String name;
        private String order_id;
        @Override
        public String toString() {
            return "ProductInfo{" +
                    "name='" + name + '\'' +
                    ", order_id='" + order_id + '\'' +
                    '}';
        }
    }

然后使用FutureTask實現一個產品信息預加載功能:

    static class Preloader {
        public void start() {
            thread.start();
        }
        private final FutureTask<ProductInfo> futureTask =
                new FutureTask<>(new Callable<ProductInfo>() {
                    @Override
                    public ProductInfo call() throws Exception {
                        return loadProductInfo();
                    }
                });
        public ProductInfo get() throws ExecutionException, 
        InterruptedException {
            return futureTask.get();
        }
        private final Thread thread = new Thread(futureTask);
        private ProductInfo loadProductInfo() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return new ProductInfo("衣服", "9527");
        }
    }

驗證代碼:

    Preloader preloader = new Preloader();
        preloader.start();
        System.out.println("start get product info before"
         + System.currentTimeMillis() / 1000);
        ProductInfo productInfo = null;
        try {
            productInfo = preloader.get();
        } catch (ExecutionException | InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("start get product info afte" 
        +System.currentTimeMillis() / 1000);
        System.out.println("productInfo: " + productInfo);

如上面的代碼所示:Preloader創(chuàng)建了一個FutureTask,其中包含了加載產品信息的任務,以及一個執(zhí)行運算的線程。我們增加了一個 Thread.sleep(5000);模擬加載耗時。由于在構造函數或者靜態(tài)初始化方法中啟動線程不是一種好方法,所以提供了一個start方法來啟動線程,當程序后面需要ProductInfo結果時,可以調用Preloader提供的get方法,如果數據已經加載,那么會返回這些數據,否則將等待加載完成后再返回。

到此這篇關于Java使用FutureTask實現預加載的示例詳解的文章就介紹到這了,更多相關Java FutureTask預加載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • RSA加密的方式和解密方式實現方法(推薦)

    RSA加密的方式和解密方式實現方法(推薦)

    下面小編就為大家?guī)硪黄猂SA加密的方式和解密方式實現方法(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Spring使用注解進行對象裝配(DI)的操作

    Spring使用注解進行對象裝配(DI)的操作

    獲取Bean對象也叫做對象裝配,就是把對象取出來放到某個類中,有時候也叫對象注入,這篇文章主要介紹了Spring使用注解進行對象裝配(DI),需要的朋友可以參考下
    2023-07-07
  • Spring Data JPA的Audit功能審計數據庫的變更

    Spring Data JPA的Audit功能審計數據庫的變更

    數據庫審計是指當數據庫有記錄變更時,可以記錄數據庫的變更時間和變更人等,這樣以后出問題回溯問責也比較方便,本文討論Spring Data JPA審計數據庫變更問題,感興趣的朋友一起看看吧
    2021-06-06
  • Spring security實現對賬戶進行加密

    Spring security實現對賬戶進行加密

    這篇文章主要介紹了Spring security實現對賬戶進行加密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • java框架之maven是用來做什么的

    java框架之maven是用來做什么的

    這篇文章主要介紹了java之maven是用來做什么的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java根據實體生成SQL數據庫表的示例代碼

    Java根據實體生成SQL數據庫表的示例代碼

    這篇文章主要來和大家分享一個Java實現根據實體生成SQL數據庫表的代碼,文中的實現代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-07-07
  • 如何將Object類轉換為實體類

    如何將Object類轉換為實體類

    這篇文章主要介紹了如何將Object類轉換為實體類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java通過Lambda函數的方式獲取屬性名稱

    Java通過Lambda函數的方式獲取屬性名稱

    這篇文章主要介紹了通過Lambda函數的方式獲取屬性名稱,實現步驟是通過定義一個函數式接口, 用來接收lambda方法引用,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 分享Spring Boot 3.x微服務升級歷程

    分享Spring Boot 3.x微服務升級歷程

    Spring Boot 3.0.0 GA版已經發(fā)布,好多人也開始嘗試升級,有人測試升級后,啟動速度確實快了不少,這篇文章主要介紹了Spring Boot 3.x微服務升級經歷,需要的朋友可以參考下
    2022-12-12
  • Java基礎之ClassLoader詳解

    Java基礎之ClassLoader詳解

    這篇文章主要介紹了Java基礎之ClassLoader詳解,文中對ClassLoader有非常詳細的解說,對正在學習java基礎的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評論