JAVA 多线程Future模式

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

Future模式的主要角色有:

Main:系统启动,调用FutureClient发出请求

FutureClient:返回Data对象,立即返回FutureData,并开启线程去获取RealData

Data:返回数据的接口

FutureData:虚拟数据类,实现Data接口,需要装载RealData

RealData:真实数据类,实现Data接口(实现方法中返回真实的数据)

示例:

Main类

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

 FutureClient类:

public class FutureClient {
    
    public Data request(final String params) {
        //1.代理对象(Data接口的实现类)先返回给发送请求的客户端,告诉他请求已经接收到了,可以做其他的事情。
        final FutureData futureData=new FutureData();
        //2.启动一个新的线程,去加载真是数据,传递给这个代理对象。
        Thread t1=new Thread(new Runnable() {
            @Override
            public void run() {
                //3.这个新的线程可以去慢慢的加载真实对象,然后传递给代理对象
                RealData realData=new RealData(params);
                futureData.setRealData(realData);
            }
        },"t1");
        t1.start();
        return futureData;
    }
}

 Data类:

public interface Data {
    String getRequest();    
}

FutureData类:

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();
    }
    @Override
    public synchronized String getRequest() {
        //如果没有装载好,程序一直处于阻塞状态
        if(!isReady) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }    
        //装载好直接获取数据
        return this.realData.getRequest();
    }
}

RealData类:

public class RealData implements Data{
    
    private String result;
    public RealData(String params) {
        System.out.println("根据参数["+params+"]加载数据!");
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        result="这是根据"+params+"查询的结果!";
    }    
    @Override
    public String getRequest() {
        return result;
    }
}

运行结果:

请求结束!
执行其他操作!
根据参数[张三]加载数据!
请求结果:这是根据张三查询的结果!

猜你喜欢

转载自blog.csdn.net/yanghzaini/article/details/84065088