多线程的设计模式:FutureMaster-Worker

Posted zys-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的设计模式:FutureMaster-Worker相关的知识,希望对你有一定的参考价值。

一 简介

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

二 Future模式

Future模式有点类似于商品订单。比如在网购时,当看中某一件商品时,就可以提交订单,当订单处理完成后,在家等待商品送货上门即可。或者说更形象的,我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无需一直等待请求的结果,可以继续浏览或操作其他内容。
技术分享图片

public class Main {

    public static void main(String[] args) {
        FutureClient futureClient = new FutureClient();
        Date date = futureClient.request("date");
        System.out.println("请求已经被处理...");
        System.out.println("去做其他操作...");
        
        System.out.println("结果为:" + date.getRequest());
    }

}

public class FutureClient {

    public Date request(final String queryStr) {
        //1.想要一个代理对象(Date接口的实现类)先返回给发送请求的客户端,告诉她请求已经被接收到,可以做其他事情
        final FutureDate futureDate = new FutureDate();
        //2.启动一个新的线程,去加载真实数据,传递给这个代理对象
        new Thread(new Runnable() {
            @Override
            public void run() {
                //3.这个新的线程可以去加载真实对象,然后传递给代理对象
                RealDate realDate = new RealDate(queryStr);
                futureDate.setRealDate(realDate);
            }
        }).start();;
        return futureDate;
    }
}

public interface Date {

    String getRequest();
}

public class FutureDate implements Date{
    private RealDate realDate;
    private Boolean isReady = false;
    @Override
    public synchronized String getRequest() {
        while (!isReady) {
            try {
                //如果没有装载完毕,程序一直处于阻塞状态
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //装载好直接获取数据
        return this.realDate.getRequest();
    }
    
    public synchronized void setRealDate(RealDate realDate) {
        while (isReady) {
            //如果已经加载完毕,就直接返回
            return;
        }
        //如果没有,就进行装载真实对象
        this.realDate = realDate;
        this.isReady = true;
        //通知
        notify();
    }
}

public class RealDate implements Date{
    private String realDate;
    public RealDate(String realDate) {
        System.out.println("根据" + realDate + "进行查询,这是一个很耗时的操作...");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果...");
        this.realDate = "查询结果";
    }
    @Override
    public String getRequest() {
        // TODO Auto-generated method stub
        return this.realDate;
    }
}

运行结果:
请求已经被处理...
去做其他操作...
根据date进行查询,这是一个很耗时的操作...
操作完毕,获取结果...
结果为:查询结果

三 Master-Worker模式







以上是关于多线程的设计模式:FutureMaster-Worker的主要内容,如果未能解决你的问题,请参考以下文章

多线程和多进程模式有啥区别

多线程设计模式简介

多线程:多线程设计模式:生产者-消费模式

我的多线程—多线程与设计模式阅读笔记

多线程设计模式

多线程:多线程设计模式:Master-Worker模式