future模式
future模式
future模式
多线程的设计模式
future模式优点类似于商品订单。
比如:当订单处理完成后,在家等待送货上门即可,或者说我们Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或者操作其他内容。
示例demo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class FutureClient {
/**
* 在发送请求时,先返回一个futureData给生产着,
* 与此同时,启动一个新的线程执行业务逻辑,没有返回真实的结果
* 在线程中,执行需要处理的业务逻辑,完成后,将处理结果存放到RealData中
*
* @param queryStr
* @return Data
*/
public Data request(final String queryStr) {
FutureData futureData = new FutureData();
new Thread(() -> {
final RealData realData = new RealData(queryStr);
futureData.setRealData(realData);
}).start();
return futureData;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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();
}
}
1
2
3
public interface Data {
String getRequest();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class RealData implements Data {
private final String result;
public RealData(String queryStr) {
System.out.println("真实的逻辑处理,在这可能耗时很久…");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务处理完了…");
String res = "业务处理的结果:" + queryStr.hashCode();
// 将处理结果赋给result
result = res;
}
@Override
public String getRequest() {
return this.result;
}
}
1
2
3
4
5
6
7
public static void main(String[] args) {
FutureClient futureClient = new FutureClient();
Data data = futureClient.request("请求参数");
System.out.println("请求发送成功");
String result = data.getRequest();
System.out.println(result);
}
本文由作者按照 CC BY 4.0 进行授权
