zoukankan      html  css  js  c++  java
  • 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的方法解析





  • 相关阅读:
    第二十三篇 jQuery 学习5 添加元素
    第二十二篇 jQuery 学习4 内容和属性
    第二十一篇 jQuery 学习3 特效效果
    第二十篇 jQuery 初步学习2
    第十九篇 jQuery初步学习
    第十八篇 JS传参数
    第十七篇 JS验证form表单
    第十六篇 JS实现全选操作
    第十五篇 JS 移入移出事件 模拟一个二级菜单
    第十四篇 JS实现加减乘除 正则表达式
  • 原文地址:https://www.cnblogs.com/linux007/p/5782704.html
Copyright © 2011-2022 走看看