博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程的设计模式
阅读量:6412 次
发布时间:2019-06-23

本文共 2250 字,大约阅读时间需要 7 分钟。

hot3.png

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

  1 future 模式 

     类似于Ajax 的异步通信,

211257_RXu7_2919420.png

 示例代码:

 

public class Main {

 

public static void main(String[] args){

FutureClient fc = new FutureClient();

Data data = fc.request("请求参数");

    System.out.println("请求发送成功!");

    System.out.println("做其他事情....");

    String result = data.getRequest();

    System.out.println(result);

}

}

================================

public interface Data {

    String getRequest();
}
=====================================

public class FutureClient {

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

}

====================================================

public class FutureData implements Data{

    private RealData realData;
    private boolean isReady = false;

    public synchronized void setRealData(RealData realData) {

        // TODO Auto-generated method stub
        //如果已经装载完毕了,就直接返回
        if(isReady){
            return;
        }
        //如果没有装载,进行装载真实对象
        this.realData = realData;
        isReady = true;
        //进行通知
        notify();
        
    }

    public synchronized String getRequest() {

        // TODO Auto-generated method stub
        //如果没有装载好,程序就一直处于阻塞状态
        while(!isReady)
            try{
                wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        //装载好 直接获取数据
        return this.realData.getRequest();
    }

}

===========================================

public class RealData implements Data{

    private String result;

    public RealData(String queryStr) {

        // TODO Auto-generated constructor stub
        System.out.println("根据"+queryStr+"进行查询,这是一个很耗时的操作...");
        try{
            Thread.sleep(5000);
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("操作完毕,获取结果");
        result ="查询结果";
    }

    public String getRequest() {

        // TODO Auto-generated method stub
        return result;
    }

}

======================================

2 Master-Work 是常用的并行计算模式,它的核心思想是系统有两类进程协作工作:Master 进程和Worker进程。Master 负责接收和分配任务,Worker 负责处理子任务。当各个Worker 子进程处理完成后,会将结果返回给Master,由Master做归纳和总结。其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。

214410_Ya3y_2919420.png

 

转载于:https://my.oschina.net/kuchawyz/blog/1807835

你可能感兴趣的文章
slice(),substring()和substr()的异同
查看>>
对话浙大博导吴飞:人工智能的前世今生
查看>>
常见前端排序方式对比
查看>>
@angular/router 源码分析之注册路由
查看>>
剥开比原看代码13:比原是如何通过/list-balances显示帐户余额的?
查看>>
http请求过程中缓存是如何工作的
查看>>
mysql主从同步问题整理
查看>>
caffe Ununtu 16.04.4开发环境配置(CPU版)
查看>>
使用开源技术构建有赞分布式 KV 存储服务
查看>>
想搞大数据??你这样是自寻死路!!
查看>>
深入理解JAVA中的NIO
查看>>
html/css系列 BFC
查看>>
【大数据实践】Kafka生产者编程(1)——KafkaProducer详解
查看>>
前端知识点整理——javascript
查看>>
被马化腾点赞的微信车票设计,背后有哪些故事?
查看>>
SpreadJS 纯前端表格控件V11.1震撼来袭
查看>>
使用MutationObserver监控dom树实现水印的不可删除属性。
查看>>
老树发新芽—使用 mobx 加速你的 AngularJS 应用
查看>>
打造属于自己的比特币钱包
查看>>
装饰模式(Decorator Pattern)
查看>>