Future設計模式

Future設計模式學習記錄備忘

Future模式設計圖

     圖片摘自(https://www.cnblogs.com/jianzh5/p/6121120.html

簡單實現代碼

  1. Data接口
    package org.cc.future;
    
    public interface Data {
        public  String  getResult();
    }
    

     

  2. FutrueData類
     

    package org.cc.future;
    
    public class FutureData implements  Data {
        RealData  data;
        boolean isRead=false;
        public synchronized void setRealData(RealData realData){
            if(isRead)
                return;
            data=realData;
            //複製成功標記isRead=true;等於true 獲取值就不用等待
            isRead=true;
            notify();
        }
        @Override
        public synchronized String getResult() {
            if(!isRead){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            return data.getResult();
        }
    }
    

     

  3. RealData(真實數據處理類)
     

    package org.cc.future;
    
    import java.util.Random;
    
    public class RealData implements  Data {
        public RealData(String request){
            try {
                Thread.sleep(1000*(new Random().nextInt(10)));
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            result="返回:"+request;
    
        }
        private String result;
        @Override
        public String getResult() {
            return result;
        }
    }
    

     

  4. FutureClient
     

    package org.cc.future;
    
    public class FutureClient {
        public  Data  request(final String  request){
            FutureData data=new FutureData();
            new Thread(()->{
                RealData  realData=new RealData(request);
                data.setRealData(realData);
                return;
            }).start();
            return  data;
        }
    
        public static void main(String[] args) {
            FutureClient  fc=new FutureClient();
            Data data= fc.request("測試");
            System.out.println("做其他的相關業務操作!");
             String result=  data.getResult();
             System.out.println(result);
        }
    }

     

Future模式總結

  1. 是一種異步執行。也是利用空間換時間的概念
  2. 適合互聯網高併發的環境
  3. Future模式在處理很消耗處理時間的業務時,可以有效 的減少相應時間

JDK java.util.concurrent.FutureTask類

JDK下面的java.util.concurrent.FutureTask已經幫我們實現此種模式

  1. 用法如下
     

    package org.cc;
    
    
    import java.util.concurrent.*;
    
    public class UseFutureTask implements Callable<String> {
        public String request;
    
        public UseFutureTask(String request) {
            this.request = request;
        }
    
        @Override
        public String call() throws Exception {
            //休息10秒模擬任務處理時間
            Thread.sleep(10000);
            return request+"以返回";
        }
    
        public String getRequest() {
            return request;
        }
    
        public void setRequest(String request) {
            this.request = request;
        }
    
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            long startTime = System.currentTimeMillis();
            FutureTask<String>  ft1=new FutureTask<String>(new UseFutureTask("測試數據一"));
            FutureTask<String>  ft2=new FutureTask<String>(new UseFutureTask("測試數據二"));
            ExecutorService  es= Executors.newFixedThreadPool(2);
            es.submit(ft1);
            es.submit(ft2);
            //休息5秒模擬處理其他任務
            Thread.sleep(5000);
           // ft1.get()返回實際結果
            System.out.println(ft1.get());//異步處理。最終返回結果小於(5000+10000)毫秒
    
            System.out.println(ft2.get());//異步返回
            long endTime = System.currentTimeMillis();
            long time_consuming = endTime - startTime;
            System.out.println("實際處理時間:"+time_consuming);
            es.shutdown();
        }
    }
    


     

  2. 執行結果
     

    測試數據一以返回
    測試數據二以返回
    實際處理時間:10083

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章