并发编程中级篇二----并行设计模式----Future模式

Future模式
类似于用户提交商品订单,下单成功以后后台异步的执行耗时的业务
在java.util.concurrent包中.Future接口是Java线程Future模式的实现,可以来进行异步计算。

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.定义一个代理类来返回数据

    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.定义一个处理大量耗时操作的类

    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);
        
        }
    }

结果如下
图片描述

你可能感兴趣的:(future,java,并行)