在下面的状态机上,让我们假设我在“StateE”中。然后是Sig1,所以转换发生了。首先我退出“StateE”,然后假设“Grd1”守卫让我通过。
现在我输入“StateH”,执行输入操作(“Act2”)。然后我将一个信号放入队列以执行“StateH”的“do”动作。这意味着在进入操作后不必执行“StateH”“do”操作,但可以首先提供其他一些已安排的信号。
然后我继续“StateG”。再次在“StateG”中,执行输入操作(“Act2”),并将“do”操作安排为信号。
信号调度程序到达StateH执行动作信号的信号队列中的点。
问题是:在执行StateH的do操作之前,我们是否从StateG退回到StateH,或者我们可以说:在StateG中也处于StateH状态,因此不需要进行状态转换,让我们执行StateH立即采取行动。
答案 0 :(得分:2)
根据UML Specification(正式 - 15-03-01,Sect.14.2.3.4.3)
状态也可能具有关联的doActivity行为。这种行为 在进入国家时开始执行(但仅在国家之后) 状态输入行为已完成)并与任何一个同时执行 可能与国家相关的其他行为,直到:•它 完成(在这种情况下生成完成事件)或• 退出状态,在这种情况下执行doActivity行为 中止。
这意味着1)doActivity在进入状态后立即执行(与您的理解相反)和2)doActivity在状态处于活动状态时继续运行。
在您的情况下,StateH
在StateG
处于活动状态时处于活动状态(请参阅活动状态配置的定义),因此StateH
的待办事项在您{{1}时保持运行}}
答案 1 :(得分:0)
在 OMG统一建模语言2.5.1 中,该语句要强一些:
此外,如果为状态定义了doActivity行为,则此行为 输入“行为”后,立即开始执行。 它与与之关联的任何后续行为同时执行 输入状态,例如输入的输入的子状态的行为 作为同一复合过渡的一部分。
我不认为这意味着状态机必须是多线程的。假设您在单个核心处理器上有一个多线程状态机。尽管可能由单独的线程执行,但各种行为和活动仍会顺序执行,即使它们是事件。