Java并发之Future设计模式(一)

并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象,与串行程序相比,并行程序的结构通常更为复杂,因此合理的使用并行模式在多线程开发中更具意义,在这里主要讲解Future、Master-Worker和生产者-消费者模糊。

一、Future设计模式

Future模式类似于商品订单,只要付完款等着商品到货即可。比如在网购时,当看到某一件商品时,就可以提交订单,当订单处理完成之后,在家里等着商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等到请求结果,可以继续浏览或操作其他内容。体现了异步请求的思想。

 

 Future设计模式主要参与者:

参与者主要作用
Main函数主要启动程序,模拟客户端Client发起请求
Data返回数据的接口
FutureData构造客户端请求的虚拟返回参数,构造很快,但是需要转配真是RealData
RealData异步构造真实数据,构造慢,耗时长

FutureClient

返回Data对象,立即返回FutureData,并开启ClientThread线程装配RealData

 1>Main函数的实现:

public class Main {

    public static void main(String[] args) {
        FutureClient futureClient = new FutureClient();
        //这里会立即返回,因为获取的是FutureData,而非RealData
        Data data = futureClient.request("请求参数");

        System.out.println("请求发送成功...");
        System.out.println("做其他的事情...");

        String result = data.getRequest();
        System.out.println(result);
    }
}

2>Data接口实现:

public interface Data {

    String getRequest();
}

3>FutureData实现

public class FutureData implements Data {

    private RealData realData;  //FutureData是RealData的封装
    private boolean isReady = false;  //是否把真实RealData构造好

    public synchronized void setRealData(RealData realData) {

        if (isReady) {
            return;
        }
        this.realData = realData;
        isReady = true;
        notify(); //RealData已经被注入到FutureData中了,通知getResult()方法
    }

    @Override
    public synchronized String getRequest() {
        while (!isReady) {
            try {
                wait();  //一直等到RealData注入到FutureData中,目前处于阻塞状态
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return this.realData.getRequest();
    }
}

4>RealData实现:

public class RealData implements Data {

    private String result;

    public RealData(String queryStr) {
        System.out.println("查询条件为:" + queryStr);
        // 利用sleep方法来表示RealData构造过程是非常缓慢的
        try {
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果");
        result = "查询结果";
    }

    @Override
    public String getRequest() {
        return result;
    }
}

5>FutureClient实现

public class FutureClient {

    public Data request(final String queryStr) {

        final FutureData  futureData = new FutureData();

        //RealData的构建很慢,所以放在单独的线程中运行
        new Thread(new Runnable() {
            @Override
            public void run() {
                RealData realData = new RealData(queryStr);
                futureData.setRealData(realData);
            }
        }).start();
        //直接先返回FutureData
        return futureData;
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunshineAndAlways

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值