09.并发编程之future模式

    package demo4;

    public interface Data {
        String getRequest();
    }
    package demo4;

    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 = "查询结果";
        }

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

    }
    package demo4;

    public class FutureData implements Data {
        private RealData    realData;
        private boolean     isReady = false;

        public synchronized void setRealData(RealData realData) {
            // 如果已经装载完成了,就直接返回
            if (isReady) {
                return;
            }
            // 如果没有装载完,进行装载真实对象
            this.realData = realData;
            isReady = true;
            notify();
        }

        public synchronized String getRequest() {
            // 如果没有装载好,程序就一直处理阻塞状态
            while (!isReady) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            // 装载好直接读取数据即可
            return this.realData.getRequest();
        }

    }
    package demo4;

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

    public class FutureClient {
        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;
        }
    }

你可能感兴趣的:(09.并发编程之future模式)