美文网首页
多线程中的设计模式

多线程中的设计模式

作者: Lamour_a9c8 | 来源:发表于2020-10-15 23:36 被阅读0次

    Future模式:我们发送ajax,页面是异步的进行后台处理,用户无需一直等待可以进行其他操作

    代码实现:

    public interface Data {

    String getRequest();

    }

    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;

    }

    }

    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() {

    //如果没装载好 程序就一直处于阻塞状态

    while(!isReady){

    try {

    wait();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    //装载好直接获取数据即可

    return this.realData.getRequest();

    }

    }

    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;

    }

    }

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

    }

    }

    相关文章

      网友评论

          本文标题:多线程中的设计模式

          本文链接:https://www.haomeiwen.com/subject/bzwbmqtx.html