活动是fUML中包含的唯一一种具体的用户行为模型。(不透明的行为也包括在fUML中,但只用于指定原始行为)。子条款7.10给出了活动的抽象语法。这种语法的要素是:活动由活动节点组成,节点之间有控制流和对象流活动边。本子条款以活动中的活动节点的激活来描述活动执行的基本语义 活动中的活动节点的激活来描述活动执行的基本语义。作为活动节点的一种的行动的语义在 8.10 中给出。
活动节点的激活如图 8.23 所示,活动执行模型是 8.8 中一般行为执行模型的扩展。除了活动执行本身外,该模型还包括活动节点激活,它指定了活动节点在特定的活动执行中的行为。节点在特定活动执行期间的行为。然后,这些节点激活被活动边实例相互连接起来 与活动中的活动边相对应。
活动节点的激活是语义访问者类,就像评价和执行一样(见8.3.1关于语义访问者类的讨论)。访客类的一般讨论)。有一个激活访问者类对应于ActivityNode的每个具体子类。访客类的名称与相应的抽象语法元类的名称相同,并加上 "激活 "一词后缀。例如,抽象语法元类JoinNode的激活访问者类被称为JoinNodeActivation。请注意,动作是活动节点,所以动作的语义是用激活访问者类指定的(见 8.10)。
活动节点的激活总是在活动节点激活组中创建。这个概念是在 执行模型中引入的,以处理活动中的嵌套组。活动本身被认为是隐含的顶层的组。
token和offer流请注意,与 Visitor Pattern 的整体使用相一致(见 8.3.1),活动执行模型有意地具有与 7.3.1 中的抽象语法模型大体平行的结构。与 7.10 中的抽象语法模型的结构基本平行。然而,在语义模型中引入的一些概念 模型中引入的一些概念,在 UML 中没有明确的语法。在这种情况下,最重要的此类概念是 token 和 offer。考虑图 8.20 中所示的简单活动模型。图 8.21 显示了这个模型的抽象语法表示。模型的抽象语法表示,它可以被赋予图 8.22 所示的语义解释。
到目前为止,图 8.22 所示的解释基本上只提供了活动的结构语义,其中活动的执行被解释为被视为分类器的活动实例。为了真正捕获行为语义,解释需要进一步定义活动的执行是如何随时间进行的。UML 2 规范用节点可能持有的代币和节点之间为这些代币的移动而提出的报价来定义活动的行为。
FUML15-12 fUML应该包括流媒体
在活动执行对象上的执行操作可以在(或)节点上显示token。 对活动执行对象的执行操作在该活动的(非流式)输入活动参数节点上显示活动的token。图 8.22 显示了图 8.20 中活动执行的早期阶段,其中输入的活动 参数节点持有一个与活动执行的输入参数值相对应的对象令牌,这个节点正在向动作的输入引脚提供令牌。然后,UML 活动执行的行为语义规则决定是否以及动作何时接受提供给它的输入引脚的令牌。
假设输入引脚的多重性为1,并且已经提供了单个值的令牌,则该操作将接受该提议,在其输入引脚上接收所提供的令牌,并启动其自己的行为。然后,具有此行为的结果值的令牌将放置在操作的输出引脚上,随后提供给输出参数节点。图8.23显示了图8.22所示执行早期阶段的后续版本的语义解释。然后,该活动的执行以输出活动参数节点接受提供的令牌结束。在执行完后,执行操作将任何(非流式)输出活动参数节点持有的令牌中的值放置到活动的相应输出参数上。
注意:在UML抽象语法中,pin是具有可选排序的多重元素,参数也是如此。然而,虽然活动参数节点可以是类型化的,但它们不是多重性元素,不能明确地标识为有序的。然而,fUML语义将输出活动参数节点解释为有效地为其关联参数指定了顺序。因此,当多个令牌从一个已排序的输出引脚流到一个输出活动参数节点时,当令牌上的值最终放置在相应的输出参数上时,这种排序被保留。
线程模型UML中活动的执行语义对活动内活动节点的并发激活没有任何限制,除了令牌语义和跨连接节点的活动边缘提供流所施加的限制。执行模型通过线程的隐式概念捕获这种并发执行语义。
当活动节点激活生成令牌并准备将其提供给下游激活时,它会在传出活动边缘实例上调用sendOffer操作。边缘实例sendOffer操作反过来通过调用receiveOffer操作向目标活动节点激活发出要约可用的信号。然后,目标活动节点激活检查其执行先决条件是否满足(在每种活动节点激活的isReady操作方法中编码),如果满足,则接受使用takeOfferedTokens操作向其发出的待定token,然后调用其fire操作。
请注意,在执行模型中,对isReady操作的自调用,以及如果激活准备就绪,对takeOfferedTokens操作的自呼叫,都发生在单个隔离区域内,即mustIsolate=true的结构化活动节点。这确保了,如果调用了takeOfferedTokens操作,那么在takeOfferdTokens作业完成之前,任何其他活动节点激活都无法接受isReady作业检查的任何提供。然而,为了不阻止与其他活动节点激活。(有关mustIsolate=true的结构化活动节点语义的讨论,请参见8.10.1。
用于活动节点激活的激发操作的方法捕获相应活动节点的执行行为,然后可能导致新的token被进一步发送到下游。虽然在执行模型中没有明确的类,但sendOffer receiveOffer fire sendOffer调用的扩展链可以被认为是通过活动执行的单个线程。
当活动开始执行时,控制令牌隐式放置在每个启用的节点上。启用的节点包括初始节点、输入活动参数节点和没有传入控制节点或输入引脚的操作。如果这样一个启用的节点立即准备好启动,那么它将在活动执行中启动一个执行线程。如果有多个启用的节点启动,那么每个节点都会在活动执行中启动一个并发线程。