多线程模式(1):Future模式

小白学习看看!记录过程

1. 创建数据处理接口

package com.xqi.f;

/**
 * 数据返回接口
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public interface Data {

    /**
     * 返回的数据
     * 
     * @return
     */
    Object getResult();

}

2. 创建真实数据返回

package com.xqi.f;

/**
 * 真实数据返回
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class RealData implements Data {

    protected final String result;

    public RealData(String para) {
        try {
            Thread.sleep(100);// 模拟业务处理耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        result = para;
    }

    public synchronized Object getResult() {
        return result;
    }

}

3. 创建Future数据代理,主要是对于真实数据进行包装操作

package com.xqi.f;

/**
 * 
 * 用于返回真实数据的代理
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class FutureData implements Data {

    // 真实数据返回
    protected RealData realData;

    // 是否可读
    protected boolean isReady = false;

    /**
     * 注入真实数据
     * 
     * @param realData
     */
    public synchronized void setRealData(RealData realData) {
        if (isReady)
            return;
        this.realData = realData;
        this.isReady = true;// 当有数据注入的时候,设置为可读
        notifyAll();// 数据注入了以后,我们要通知这个对象线程可以开始读取了
    }

    /**
     * 用户返回处理完成的数据
     */
    public synchronized Object getResult() {
        while (!isReady) {// 当不可读的时候
            try {
                wait();// 设置为对象线程等待
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return realData.getResult();
    }

}

4. 创建模拟请求的客户端

package com.xqi.f;

/**
 * 客户端的实现
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class Client {

    /**
     * 用于发送一个处理数据的请求并返回结果
     * 
     * @param queryStr
     * @return
     */
    public Data reqeust(final String queryStr) {
        
        final FutureData future = new FutureData();

        new Thread() {
            @Override
            public void run() {
                RealData realData = new RealData(queryStr);
                future.setRealData(realData);
            }
        }.start();
        return future;
    }

}

5. 测试Test

package com.xqi.f;

/**
 * 测试的main
 * 
 * @author mike <br>
 *         2015年7月23日
 */
public class FTest {

    public static void main(String[] args) {
        Client client = new Client();
        Data data = client.reqeust("name"); //这里可以很快的返回结果,因为返回的是FutureData 
        System.out.println("请求完毕!");

        try {
            Thread.sleep(2000);// 模拟业务操作耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("真实数据:" + data.getResult());

    }

}


PS: 确实以前对于多线程的环节了解比较少!在业务比较少的情况下,还是看起来压力,但是负责,光是看图,了解流程,已经很是无奈的摇头了!







你可能感兴趣的:(多线程模式(1):Future模式)