• Java之多线程中的Future模式


    应用场景:线程A需要线程B的执行结果,但没必要一直等待线程B执行完,这个时候可以先拿到未来的Future对象,等线程B执行完再来取真实结果。
    定义RealData真实数据类,其构造函数很慢,是用户最后需要使用的数据,
        static class RealData<T> {
    protected T result;

    public RealData(T result) {
    this.result = result;
    }

    public T getResult() {
    return result;
    }
    }
    定义Future对象任务类,其是Future模式的关键,是真实数据RealData的代理,封装了获取RealData的等待过程。
    public class FutureData<T> {
    private static final UtilsLog lg = UtilsLog.getLogger(FutureData.class);
    protected boolean isReady = false;
    private RealData<T> realData = null;
    private Object mutix = new Object();

    public static FutureData request(final String request) {
    lg.e("新建FutureData对象");
    final FutureData future = new FutureData();
    new Thread(new Runnable() {
    @Override
    public void run() {
    UtilsThread.sleepIgnoreInteruptedException(5000);
    lg.e("*************模拟耗时线程with time :5000******");
    RealData realData = new RealData(request);
    future.setRealData(realData);
    }
    }).start();
    lg.e("返回新建的FutureData对象");
    return future;
    }

    public T getResult() {
    synchronized (mutix) {
    while (!isReady) {
    lg.e("getResult:before wait");
    try {
    mutix.wait();
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    lg.e("getResult:after wait");
    }
    lg.e("getResult:" + realData.getResult().toString());
    return realData.getResult();
    }
    }

    public void setRealData(RealData<T> realData) {
    lg.e("执行设置数据:setRealData");
    if (this.isReady) {
    return;
    }
    this.realData = realData;
    this.isReady = true;
    synchronized (mutix) {
    mutix.notify();
    }
    }
    }
    在业务层发起请求,并调用getResult方法等待返回任务执行结果。
    FutureData futureData = FutureData.request("我要执行耗时任务");
    lg.e("bootUpTestFunction result:" + futureData.getResult());
    运行结果如下所示,分析知getResult方法中若isReady=false则调用wait()锁定当前线程,直至setRealData中调用notify()后继续执行wait后的方法。


    关于Object的wait以及notify的相关知识点,请查看Java之Object的wait与notify的方法解析





  • 相关阅读:
    异常:java.io.IOException: Too many open files:
    转载 Servlet3.0中使用注解配置Servle
    Spring 源码从github导入源码到idea2016
    git 命令
    常用linux命令
    mysql优化常用语句
    mysql中in、not in、exists和not exists的区别
    mysql优化
    php常用的数据结构算法
    算法(一)
  • 原文地址:https://www.cnblogs.com/linux007/p/5782704.html
Copyright © 2020-2023  润新知