併發編程中級篇二----並行設計模式----Future模式

Future模式
相似於用戶提交商品訂單,下單成功之後後臺異步的執行耗時的業務
在java.util.concurrent包中.Future接口是Java線程Future模式的實現,能夠來進行異步計算。java

Future模式

1.定義一個接口來處理請求異步

public interface Data{
        String getRequest();
    }

2.定義一個轉發請求的客戶端測試

public class FutureClient{
    
        public Data request(final String queryStr){
        
            //1.添加一個代理對象(Data接口的實現類) 先返回給發送請求的客戶端 
            //告訴客戶端收到請求,能夠處理其餘事情
            final FutureData futureData = new FutureData();
            //2.啓動一個新的線程 去加載真實的數據 傳遞給這個代理對象
            new Thread(new Runnable(){
                public void run(){
                    //3這個新的線程能夠去慢慢的加載真實對象 
                    //而後傳遞給代理對象
                    RealData realData = new RealData(queryStr);
                    futureData.setRealData(realData);
                }
            }).start();
            
            return futureData;
        }
        
    }

3.定義一個代理類來返回數據this

public class FutureData implements Data{
        
        private RealData realData;
        
        private boolean isReady = false;
        
        public void synchronized void setRealData(RealData realData){
            //若是已經轉載完畢 直接返回
            if(iReady){
                return;
            }
            //若是沒有裝載,進行裝載真實對象
            this.realData = realData;
            isReady = true;
            //進行通知
            notify();
            
        }
        
        public synchronized String getRequest(){
            //若是沒有裝載好 程序就一直處於阻塞的狀態
            while(!isReady){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //裝載好直接獲取數據便可
            return this.realData.getRequest();
        }
    }

4.定義一個處理大量耗時操做的類spa

public class RealData implements Data{
        
        private String result;
        
        public RealData(String queryStr){
            System.out.println("根據" + queryStr + "進行查詢,
            這是一個很耗時的操做..");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("操做完畢,獲取結果");
            result = "查詢結果";
        }
        
        public String getRequest(){
            retun result;
        }
    }

5.定義一個測試類線程

public class Main{
        
        public static void main(String[] args) throws InterruptedException {
            
            FutureClient fc = new FutureClient();
            Data data = fc.request("發送請求");
            System.out.println("請求發送成功!");
            System.out.println("作其餘的事情...");
            
            String result = data.getRequest();
            System.out.println(result);
        
        }
    }

結果以下
圖片描述代理

相關文章
相關標籤/搜索