java Future模式的使用


一、Future模式的使用。

Future模式簡述

       傳統單線程環境下,調用函數是同步的,必須等待程序返回結果后,才可進行其他處理。 Futrue模式下,調用方式改為異步。

Futrue模式的核心在於:充分利用主函數中的等待時間,利用等待時間處理其他任務,充分利用計算機資源。

 

主要角色

Main:系統啟動,調用Client發出請求

Client:返回Data對象,立即返回FutureData,並開啟ClientThread線程裝配

RealData Data:返回數據的接口

FutureData:Futrue數據,是一個虛擬的數據,需要裝配RealData RealData:真實數據,構造比較慢

 

二、實現代碼

 Main類

public class Main {
    public static void main(String[] args) {
        FutureClient fc = new FutureClient();
        Data data = fc.request("請求參數");
        System.out.println("請求參數發送成功");
        System.out.println("開始做其他事情");
        String result = data.getRequest();
        System.out.println(result);
    }
}

 

FutureCliet類

   

public Data request(final String queryStr) {
        // 1 我想要一個代理對象(Data接口的實現類)先返回給發送請求的客戶端,
        // 告訴他的請求已經收到,可以干其他事情
        final FutureData futureData = new FutureData();

        // 2.創建一個新的線程,去加載真是數據,傳遞個這個代理對象
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 3.這個新的線程可以慢慢去加載真是對象,然后傳遞給代理對象
                RealData realData = new RealData(queryStr);
                futureData.setRealData(realData);
            }
        }).start();

        return futureData;
    }

 

Data接口

    

public interface Data {
    String getRequest();
}

 

FutureData

public class FutureData implements Data {

    private RealData realData;

    private boolean isReady = false;

    @Override
    public synchronized String getRequest() {

        // 如果沒有裝載好久一直處於阻塞狀態
        while (!isReady) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 裝載好可以直接獲取數據
        return this.realData.getRequest();
    }

    public synchronized void setRealData(RealData realData) {
        if (isReady) {
            return;
        }
        this.realData = realData;
        isReady = true;
        notify();
    }

}

 

RealData

 

public class RealData implements Data {

    private String result;

    public RealData() {
    }

    public RealData(String queryStr) {
        System.out.println("根據" + queryStr + "進行查詢" + "這是一個很耗時間的操作...");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("操作完畢");
        result = "查詢結果";
    }

    @Override
    public String getRequest() {
        return result;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM