文章

future模式

future模式

future模式

多线程的设计模式

future模式优点类似于商品订单。

比如:当订单处理完成后,在家等待送货上门即可,或者说我们Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或者操作其他内容。

Future模式示意图

示例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 进行授权