多线程中的设计模式

2020-10-15  本文已影响0人  Lamour_a9c8

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

}

}

上一篇下一篇

猜你喜欢

热点阅读