目录
1、概念
2、主动类
3、通信
4、同步
5、常用建模技术
5.1、对多控制流建模
5.2、对进程间通信建模
在UML中,可以将每一个独立的控制流建模为一个主动对象,它代表一个能够启动控制活动的进程或线程。
进程是一个能与其他进程并发执行的重量级的流;
线程是一个能与同一进程中的其他线程并发执行的轻量级的流。
主动对象是类的一个实例,在这种情况下,它是主动类的实例。同样也像所有的对象一样,主动对象通过传送消息进行互相之间的通信,然而在这里,消息的传送必须扩充某些并发语义,以帮助同步相互独立的流之间的交互。
主动类是类的一种,所以具有类的所有通常部分,包括类名、属性和操作。主动类经常接收信号,通常把这些信号列在一个附加栏中。
1、概念
主动对象 (active object)是拥有进程或线程,并能够启动控制活动的对象。
主动类 (active class)是其实例为主动对象的类。
进程 (process)是能同其他的进程并发执行的重量级的流;
线程 (thread)是能与同一进程中的其他线程并发执行的轻量级的流。
在图形上,主动类用一个左右边为双线的矩形来表示。
进程和线程用衍型化的主动类来表示(而且也在交互图中作为一个序列出现)
一个主动类表示一个独立的控制流,而普通的类不能体现这样的流。
与主动类相比,普通类隐含地被称作被动的,因为它们不能独立地启动控制活动。
2、主动类
主动类拥有与所有其他类相同的特性。
主动类可以有实例;主动类可以有属性和操作;主动类也可以参与到依赖、泛化和关联(包括聚合)关系中;主动类可以使用UML的任何扩展机制,包括衍型、标记值和约束;主动类可以是接口的实现;主动类可以由协作实现,它的行为可以用状态机来说明;主动类还可以参与协作。
3、通信
当对象相互协作时,它们通过从一个对象向另一个对象发送消息来进行交互。
四种交互组合:
1)消息可以在被动对象之间传递。
假定在一个时间点只有一个控制流通过这些对象,这样的一个交其实就是对一个操作的简单引用。
2)消息从一个主动对象传送到另一个主动对象。
当这种情况发生时,就有了进程间的通信,并且有两种可能的通信类型:
一种类型是,一个主动对象可能同步地调用另一个主动对象的操作。这种通信具有会合的语义,即:调用者调用操作;调用者等待接受者接受这个调用;操作被引用;为基于接收者对象的操作和类的执行选择一个方法;方法被执行;一个返回对象(如果有)被回送给调用者;然后二者分别继续它们的各自独立的路径。在调用过程中,两个控制流的步调是固定的。
另一种类型是,一个主动对象可能异步地发送一个信号或调用另一个对象的一个操作。这种通信具有邮箱的语义,这意味着调用者发送信号或调用操作,然后就继续它自己的独立的路径。在此期间,接收者在(通过插入事件或调用队列)做好准备时才接受信号或调用,完成后继续执行它的路径。之所以称这种通信为邮箱,是因为这两个对象不是同步的,而是一个对象给另一个对象留下一个消息后就离开。
在UML中,用实心箭头来表示同步消息,用枝状箭头来表示异步消息
3)消息从一个主动对象传送到一个被动对象。
如果在一个时间点上,有多于一个主动对象通过一个被动对象传送它们的控制流,那么就出现了潜在的冲突。如果同时有多个对象写或者读写同一个属性,那就是真正的冲突了。
4)消息从一个被动对象传送到一个主动对象。
初看起来,这显得不合法,但如果记住每个控制流都是以某些主动对象为根,就会理解,从被动对象传送消息到主动对象与从主动对象传送消息到主动对象具有相同的语义。
4、同步
当同一时间在一个对象中有多个控制流时,就出现了问题。如果不小心,可能有一个以上的流来修改同一属性,破坏对象的状态或丢失信息。这是典型的相互排斥问题。
三种方法建模:
1)顺序的(sequential)。调用者必须在对象外部进行协调,使得在一个时刻对象中只有一个流。当有多个控制流出现时,就无法保证该对象的语义和完整性。
2)监护的(guarded)。当有多个控制流出现时,该对象的语义和完整性是通过把所有对受监护的对象操作的调用顺序化来保证的。其效果是,在一个时刻对象恰好只有一个操作能够执行,使之简化为顺序的语义。如果没有设计好,就会有死锁的危险。
3)并发的(concurrent)。当有多个控制流出现时,该对象的语义和完整性得到保证是因为多个控制流存取不相交的数据集合,或者只读取数据。可以通过仔细设计的规则来安排这种情况。
可以允许同时有多个读者,但只允许有单独一个写入者来修改concurrent特性
5、常用建模技术
5.1、对多控制流建模
在UML中,可以使用包含主动类和主动对象的类图(捕捉它们的静态语义)和交互图(捕捉它们的动态语义)来做此事。
上图显示了一个商务系统的进程视图的一部分。可以发现3个对象并发地把信息放入系统中:StockTicker、IndexWatcher和CNNNewsFeed(名称分别为s、i和c)。这些对象中的两个(s和i)与它们自己的Analyst实例(a1和a2)通信。至少对于这个模型来说,可以简单地假定这个Analyst一个时刻只有一个控制流在它的实例中是活动的。然而,Analyst的两个实例都同时与AlertManager(名称为m)通信。因此,m必须被设计为在多个控制流出现时能维持它的语义。m和c同时与t(一个TradingManager)进行通信。每个流都给定一个由拥有它的控制流来区分的序号。
5.2、对进程间通信建模
进程间通信有两种经典的方式,即消息传送和远程过程调用。
用异步通信对消息建模,用同步通信对远程过程调用建模。
上图显示了一个分布式预订系统,它的进程跨越4个结点。每个对象都用process衍型来标记。每个对象还用一个 location 属性来标记,以说明它的物理位置。在Reserva-tionAgent、TicketingManager和HotelAgent之间的通信是异步的。
用一个注解来描述通信是建立在Java Beans消息服务上的。
在TripPlanner和ReservationSystem之间的通信是同步的。它们的交互语义可以在名为CORBA ORG的协作中找到。TripPlanner作为一个client工作,ReservationAgent 作为一个server 工作。通过放大这个协作,将发现有关服务器端与客户端之间是如何协作的细节。