多线程应用程序的UML图


25

对于单线程应用程序,我喜欢使用类图来概述该应用程序的体系结构。但是,在尝试了解大量的多线程/并发应用程序时,这种类型的图并不是很有用,例如,因为类的不同实例在不同的线程上“处于活动状态”(意味着访问一个实例仅从一个实例中保存)线程继续存在)。因此,类之间的关联并不一定意味着我可以在那些对象上调用方法,而是必须在目标对象的线程上进行该调用。

我在该主题上挖掘过的大多数文献 ,例如Hassan Gomaa的UML设计并发,分布式和实时应用程序,都有一些不错的主意,例如将线程边界绘制到对象图中,但总体而言似乎有点学术性和冗长性真的很有用。

我不想将这些图用作问题域的高级视图,而只是作为我的类/对象,它们之间的相互作用以及我上面提到的线程边界所造成的限制的详细描述。

因此,我想知道:

  1. 您发现哪种类型的图对理解多线程应用程序最有帮助?
  2. 对经典UML的扩展是否考虑了多线程应用程序的特殊性,例如通过说明
    • 有些对象可能生活在某个线程中,而另一些对象则没有线程亲和性;
    • 对象的某些字段可以从任何线程读取,但只能从一个线程写入。
    • 有些方法是同步的并返回结果,而另一些方法则是异步的,这些方法使请求排队,并例如通过不同线程上的回调返回结果。

2
我个人发现活动图对于(潜在地)并发用例/过程建模很有用,但是如果您想深入到类/对象级别,则它们并不十分适合。
彼得Török

Answers:


12

关于线程如何执行的最重要的见解可以通过所谓的序列图来描述。这是维基百科的一个例子

在此处输入图片说明

该图从本质上绘制了事件列表以及通常称为生命线的垂直单线上的方向。在这种情况下,每个线程都是其自身生命线的所有者。该图允许表示所有类型的事件,例如同步,异步等。

在这种系统中,另一个最重要的事情是状态图或状态图。通常,仅当模型表示为状态机时才适用。但是,在大多数多线程系统(其中线程是非平凡的)中,最好将它们设计为使用隔离算法处理不同状态。

还有其他图类型,例如交互图通信图,但我认为尝试绘制顺序图状态图将使清晰度最大化。


6

我的答案是对Dipan的补充,因为它涉及UML序列图。我发现不是100%纯UML的样式也可以。看一下并发模式中使用的图。有些几乎类似于UML(但是这绝对不是标准的):

在此处输入图片说明

如果您熟悉Java线程同步中的等待/通知,那么您会从我提到的文档中欣赏以下序列图:

在此处输入图片说明


这也适用于.NET / C#,并且Visual Studio具有内置的UML序列图工具,其中包括用于描述多线程行为的控制流片段类型。请参阅msdn.microsoft.com/en-us/library/dd465153.aspx#Anchor_1
David Burg,

0

对于使用相同类的多线程应用程序,技巧可能是将相同的类拖放到表示线程的每个模型中。您将能够拥有具有不同视图的相同类,并通过单击类,图或代码来浏览模型和代码。我知道模型合并不是一个众所周知的概念,但是在Omondo的Eclipse中它确实可以很好地工作。

我的意思是,当我建模由多个项目组成的大型应用程序时。我为每个项目创建一个模型,然后将它们合并到一个更大的项目中。所有建模都是使用类图完成的,该类图是将整个项目从Java代码转换为UML时获得的模型。我的意思是,在我的示例中,我使用现有代码并将其反转为单个UML模型,然后将所有已创建UML模型的反向代码合并为一个大型模型。您也可以创建多个模型,而不用反转现有代码。它可以双向工作-在没有代码的情况下创建,或在使用现有代码的逆向工程阶段。

我不知道这是否有意义,但是您可以创建一个大型模型,像对多项目建模那样为每个线程重新组合子模型?希望能有所帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.