并发编程(11)-Future模式

来源:互联网 发布:福建广播网络电视台 编辑:程序博客网 时间:2024/06/05 13:25

Future模式有点类似于商品订单。比如在网购时,当看中某一个商品时,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可继续浏览或操作其他内容。

这里写图片描述

package com.thread.mythread.conn015;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);    }}

打印结果:

请求发送成功!
做其他的事情…
根据请求参数进行查询,这是一个很耗时的操作..
操作完毕,获取结果
查询结果

1.客户端发送请求

客户端发送请求,包装类返回“假”的结果,同时创建一个线程去执行真实的操作。

package com.thread.mythread.conn015;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;    }}

2.包装类操作

package com.thread.mythread.conn015;public interface Data {    String getRequest();}
package com.thread.mythread.conn015;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();    }}

3.真实结果

package com.thread.mythread.conn015;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() {        return result;    }}
原创粉丝点击