当在某线程下想要另一线程的返回结果可以通过FutureTask的get方法阻塞线程直到另一线程返回结果。
我们用wait和notify简单实现一下juc下的Future模式。
创建抽象类Data
public abstract class Data {
public abstract String getRequest();
}
数据类
public class RealData extends Data {
private String requestResult;
public RealData(String requestData) {
System.out.println("正在使用data进行网络请求,data: " + requestData + ",开始。。。");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("操作执行完毕。。。获取到结果");
this.requestResult = "无可奈何花落去石材城李志奇";
}
@Override
public String getRequest() {
return requestResult;
}
}
创建一个FutureData类
此为关键,当请求数据时,如果数据为空,就阻塞,直到获取到数据
public class FutureData extends Data {
private boolean FLAG = false;
private RealData realData;
public synchronized void setReadData(RealData readData) {
if (FLAG) {
return;
}
this.realData = readData;
FLAG = true;
notify();
}
@Override
public synchronized String getRequest() {
while (!FLAG) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return realData.getRequest();
}
}
创建FutureClient类
public class FutureClient {
public Data request(String requestData) {
FutureData futureData = new FutureData();
new Thread(() -> {
RealData realData = new RealData(requestData);
futureData.setReadData(realData);
}).start();
return futureData;
}
}
main方法
public class Main {
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Data request = futureClient.request("563634634634");
System.out.println("main,数据发送成功");
System.out.println("主线程执行其它任务");
String result = request.getRequest();
System.out.println("主线程获取reslut: " + result);
}
}