并发编程:Future模式

一、Future模式

Futrue模式:对于多线程,如果线程A要等待线程B的结果,那么线程A没必要等待B,直到B有结果,可以先拿到一个未来的Future,等B有结果是再取真实的结果。

二、Future模式Demo

公共的数据接口,真实数据和未来数据都要实现该接口

package ConcurrentProgramming.middle.part3.Future;

/**
 * @Author: zdj
 * @Description: 公共数据接口 FutureData 和 RealData都要实现
 * @Date: 2019年03月14日 14:54
 */
public interface Data {
    String getRequest();
}

FutureData,未来数据。客户端发出请求时,直接响应该对象,通知客户端请求已经接受到,正在处理。

package ConcurrentProgramming.middle.part3.Future;

import javax.annotation.Resource;

/**
 * @Author: zdj
 * @Description: 未来数据,客户端发出请求时,直接响应该对象,通知客户端请求已经接受到,正在处理。
 * @Date: 2019年03月14日 14:55
 */
public class FutureData implements Data {

    private RealData realData;

    /**
     * 用来判断数据是否准备完毕
     */
    private boolean ready = false;

    public synchronized void setRealData(RealData realData) {
        //如果数据准备完毕直接返回
        if (ready) {
            return;
        }
        //数据未准备,则装载数据
        this.realData = realData;
        ready = true;
        //唤醒阻塞线程
        notify();
    }

    public synchronized String getRequest() {
        //没有准备好数据,阻塞
        if (!ready){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //准备好直接返回
        return this.realData.getRequest();
    }
}

真实数据,客户端发出请求后,FutureData未来数据要加载的数据

package ConcurrentProgramming.middle.part3.Future;

/**
 * @Author: zdj
 * @Description: 真实数据,客户端发出请求后,FutureData未来数据要加载的数据
 * @Date: 2019年03月14日 14:57
 */
public class RealData implements Data {

    private String result;

    public RealData(String queryStr){
        System.out.println("根据" + queryStr + "进行查询,这是一个很耗时的操作..");
        try {
            Thread.sleep(5000);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果。。。");
        result = "结果来了";
    }

    public String getRequest() {
        return result;
    }
}

客户端

package ConcurrentProgramming.middle.part3.Future;

/**
 * @Author: zdj
 * @Description: 客户端
 * @Date: 2019年03月14日 15:27
 */
public class FutureClient {
    public Data request(final String queryStr){
        //1、先返回一个空的数据给客户端,告诉客户端请求已经收到,正在获取数据
        final FutureData futureData = new FutureData();
        //2、启动一个新的线程,去加载真实的数据,获取完毕后,将真实数据返回给客户端
        new Thread(new Runnable() {
            public void run() {
                RealData realData = new RealData(queryStr);
                futureData.setRealData(realData);
            }
        }).start();
        //先返回FutureData,异步加载真实数据
        return futureData;
    }

}

测试Main

package ConcurrentProgramming.middle.part3.Future;

/**
 * @Author: zdj
 * @Description: Future模式 先返回给客户端一个空的数据,告诉客户端请求收到,
 *               异步去加载真实数据。当客户端真正使用数据的时候,返回给客户端真实数据
 *               此时如果数据没有加载完毕,则会阻塞线程,直至数据加载完毕。
 * @Date: 2019年03月14日 15:31
 */
public class Main {
    public static void main(String[] args) {
        FutureClient futureClient = new FutureClient();
        Data data = futureClient.request("请求参数");
        System.out.println("请求发送成功!");
        System.out.println("做其他的事情...");

        String result = data.getRequest();
        System.out.println(result);
    }
}

运行结果

参考链接:https://www.cnblogs.com/plxx/p/4574141.html

 

 

 

 

 

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