(一)并行程序设计模式的介绍

并行程序设计模式的介绍

Future模式

   Future模式有点类似商品订单,是将异步请求和代理模式联合的模型产物
   客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订单,不是商品本身),用户也无需等待,先去执行其他的若干操作后,再去调用服务器已经完成组装的真实数据。该模型充分利用了等待的时间片段。
角色作用
Main启动系统,调用Client发出请求;
Client返回Data对象,理解返回FutureData,并开启ClientThread线程装配RealData;
Data返回数据的接口;
FutureDataFuture数据,构造很快,但是是一个虚拟的数据,需要装配RealData;
RealData真实数据,构造比较慢。

Master-Worker模式

   系统由两类进程协同工作:Master进程和Work进程。Master近成负责接收和分配工作,work进程负责处理子任务。当各个Worker进程将子任务处理完成后,将结果返回给Master进程,有Master进程归纳和汇总,从而得到系统的最终结果。
   Master-worker模式的好处模式的好处,他能够将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。
   Master-Worker模式是一种使用多线程进行数据处理的结构,多个Worker进程协作处理用户请求,Master进程负责维护Worker进程,并整合最终处理结果。
角色作用
Worker用于实际处理一个任务;
Master任务的分配和最终结果的合成;
Main启动程序,调度开启Master。

Guard Suspension保护性暂挂模式

  Guarded Suspension模式意为保护暂停,核心思想是当服务进程准备好时,才提供服务。当服务器在很短时间内承受大量的客户端请求,客户端请求的数量可能超过服务器本身的即使处理能力,所以让客户端一个一个排队,由服务端程序一个接一个处理。
  Guarded Suspension模式在一定程度上环节系统的压力,可以将系统的负载在时间轴上均匀的分配,使用该模式后,可以有效降低系统的瞬时负载,可以提高系统的抗压力和稳定性有一定帮助。
角色作用
Request表示客户端请求
RequestQueue用于保存客户端请求队列
ClientThread客户端进程
ServerThread服务器进程

Immutable Object不变模式

  不变模式天生就是多线程友好,它的核心思想是,一个对象一旦创建,它的内部状态将永远不会改变,所有,没有一个县城可以修改其内部状态和数据,同时,其内部状态也绝不会自行发生改变。
  不变模式和只读模式的区别:不变模式具有更强的一致性和不变性,对只读属性的对象而言,对象不能被其他线程修改,但是对象的自身状态却可能自行修改。
  应用场景:对象创建后,其内部状态和数据不在发生任何变化。或者对象需要被共享、被多线程频繁访问。

Two-phase Termination两阶段终止模式

 在多线程中,线程会因为各种原因停止,但这并不简单。首先Java没有提供直接的API用于停止线程。而且停止线程的时候还有一些问题需要处理,比如线程的信息保存问题。所以需要有程序优雅的停止线程。
  解决这个问题分为两个时间短,第一个时间段是准备阶段,这个阶段通知目标线程,使得线程开始进行相关处理。第二时间段是执行阶段,检查准备阶段设置的线程停止标志和信号,在次基础上决定线程停止的时机,并进行适当的“清理”操作。 
  用一个ImmutableObject类来存储不可变值的信息,改参与者不对外暴露任何可以修改其状态的方法,另一个类负责维护上一个类所创建信息的实体的变更,党相应的现实实体状态变更是,改参与者负责生成新的ImmutableObject,以反应新的状态。

Producer-Consumer生产者-消费者模式

  生产者-消费者模式中,生产者线程负责提交用户请求,消费者线程则负责集体处理生产者提交的任务。生产者和消费者之间通过共享共享内存缓冲区进行通信。
角色作用
生产者用于提交用户请求,提取用户任务,并装入内存缓冲区
消费者在内存缓冲区中提取并处理任务
内存缓冲去缓存生产者提交的任务或数据,供消费者使用
任务生产者向内存缓冲区提交的数据结构
Main使用生产者和消费者的客户端

Active Object主动对象模式

  有的时候需要线程中的方法与调用分离,即在线程外用方法调用线程内方法,可是线程内的方法不能被直接调用,所以需要这里的主动对象模式处理这个问题。

Thread Pool(线程池)模式

   一个系统中的线程相对与其所要处理的任务而言,总有一种非常有限的资源,线程不仅在其执行任务是需要消耗CPU时间和内存等资源,线程对象本身以及线程所需的调用栈也占用内存,并且Java中创建一个线程往往意味着JVM会创建相应的依赖与宿主机操作系统的本地线程。所以,为每个或者每一批任务创建一个线程以对其进行执行,通常是一种奢侈而不现实的事情。

Thread Specific Storage(线程特有存储)模式

   多线程相关问题,引入线程安全、死锁等对根就地是多变成共享变量导致的。如果解决了共享变量的问题,就可以让一部分无需共享变量的线程没有线程安全的问题。

Thread Confinement(串行线程封闭)模式

   如果并发任务的执行涉及某个非线程安全对象,而很多时候我们又不希望因此而引入锁。

Pipeline(流水线)模式

   有时一些线程的步奏比较冗长,而且由于每个阶段的结果与下阶段的执行有关系,又不能分开

Half-sync/Half-async(半同步/半异步)模式

   同步和异步各有各的优势,有没有一个方法,能够既保持了同步编程的简单性,又充分发挥异步编程在提高系统并发性方面的优势。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值