【问题标题】:Is there an inituitive UML approach to depict threads是否有一种直观的 UML 方法来描述线程
【发布时间】:2009-06-05 03:44:51
【问题描述】:

我喜欢使用 UML 图来描述我的软件。在大多数情况下,这些图表是供我自己使用的,我将它们用于更多涉及的代码片段、交互等。我将受益于将来能够回顾它们。

我发现自己以几种不同的方式做的一件事是绘制线程图表。线程本质上倾向于出现在更复杂的代码片段中,并且跟踪它们通常是我的设计文档的主要目的。

过去,我在序列图中使用了一个符号来显示新线程的创建,但回顾一些图表,这样做有时会在对象的生命周期(序列图的用途)和线程的生命周期之间模棱两可.有没有更好的方法将线程合并到 UML 中?

【问题讨论】:

标签: multithreading uml


【解决方案1】:

我设法制作了一个在绘制时对我有意义的图表。基本前提是我已经用代表线程生命周期的蓝色方框覆盖了代表类实例的灰色方框。它让我跟踪的主要事情是知道当我调用某些方法时我将在哪个线程上执行。

毫无疑问,有更好、更直观的方法来进行线程和类建模。对我而言,衡量成功的标准是我自己的图表在 6 个月后是否仍能给予我相同的理解水平。

【讨论】:

  • 视觉上可能有意义,但建模却没有。叠加层没有 UML 含义。至于它是否满足您对文档的需求,如果效果很好的话。
  • “但没有建模” - 你的意思是:但 UML 建模没有。我确实查看了您提供的示例,但没有合适的。我怀疑在构思 UML 标准时线程并不是什么大问题。
  • 我支持 sipwiz - UML 不拥有“建模”一词。我比较喜欢这张图。
【解决方案2】:

活动图、序列图和状态图都是显示线程行为的正确方法。

第一个:(致 vs 的 cmets)UML 中有两组图表或建模元素,如您所说的静态结构和行为。任何一本书都会帮助您理解这种分裂,通常是在内容/TOC 中,此外,它可以在 Martin Fowler 的 UML 的第 11 页上看到,在我看来,这是一个近乎事实的 UML 开始标准。

第二次:(对于 sipwiz 的问题和评论)活动图通常不被理解为业务流程建模,但它们可以用于此,大多数示例或简单教程都会从业务中处理它立场。

讨论您对线程建模的选择:

活动图 - 允许通过使用 BAR 和使用线来分叉和指定并发性。请注意,底部的示例不是业务流程example。大多数人都可以阅读这些内容,业务、管理和开发人员,但有时他们可能会缺乏细节或变得混乱。

序列交互图 - 在同一篇文章example 中,您将看到序列图允许您通过使用标签“par”将可并行行为装箱来指定序列中的并行行为,这是有助于向读者展示哪些方法可以或应该并行调用,即由不同的线程调用。这是我将用于详细开发人员的方法,例如围绕构建对象进行讨论。

状态图 - 状态图就像活动一样,通过使用 BAR 和使用线来允许并发。

注意:这些不会为特定线程建模,它是精确的提升周期,因为这是建模的实例/运行时级别的一部分,如果这是什么你想澄清你的问题,我会回应。我只是使用上述方法之一对其进行建模,因为除了 MDA/UML 专家之外没有其他人会叫你出来,而且你不会生成一个正在运行的系统。

另外:请注意,可以在大多数 UML 书籍中找到更多详细信息。 还利用:http://www.jguru.com/faq/view.jsp?EID=56322

【讨论】:

    【解决方案3】:

    传统的线程是使用 Petri 网以图解方式描述的。 Rob Martin 在 UML 中的多线程上有 an article,您可能会发现它很有用。

    更新——刚刚记得你可以在活动图中用分叉表示线程——我已经设法find something that explains this。

    很难找到任何有关 Petri 网的免费教程,但我知道 Petri 网非常适合并发建模,所以我在 Google 上搜索了“生产者-消费者 Petri 网”(我最喜欢的线程)和 found this。

    我还找到了一些显示 Petri Nets modeling a Semaphore 的幻灯片。

    【讨论】:

    • 你的“解释这个的东西”链接现在被破坏了
    【解决方案4】:

    UML 活动图具有 fork 和 join 元素以显示并行的逻辑流。

    【讨论】:

    • 活动图通常被理解为对业务流程进行建模。我更感兴趣的是对我的软件的内部工作进行建模。不过我同意你的观点,活动图的某些方面在建模软件线程时很有用。
    • @sipwiz:活动图仅用于业务流程的说法并不正确。请看我的回答。
    【解决方案5】:

    我不知道有什么办法,但考虑到线程在许多语言中被实现为Thread(或类似)类,使用序列图似乎并不完全不合适。

    与 UML 最兼容的方式可能是添加某种注释,表明“对象”代表一个线程。

    【讨论】:

    • 是的,我之前用时序图来描述线程同步。刚好又找到一张图,名字叫timing diagram,很有意思。
    【解决方案6】:

    UML 由 UML 上层结构定义,您可以在此处找到它http://www.omg.org/spec/UML。 如果您阅读规范,您会发现 UML 类可以处于活动状态。活动类是元属性 isActive 设置为 true 的类。它也有不同的描绘。 活动类的对象实例自动执行“分类器行为”。至于任何行为,您可以通过等待异步信号 (AcceptEventActions) 并调用方法 (CallOperationAction) 或其他行为 (CallBehaviorActions) 的活动来定义它。这就是在 UML 中对活动对象建模的方式。您只需阅读 UML 规范。

    【讨论】:

      【解决方案7】:

      活动图将使用分叉和连接来表示线程来模拟您的软件的内部运作。要了解确切如何正确建模,请参阅 Conrad Bock 的优秀系列文章。 Here 是涵盖分叉和连接的文章,但您应该按照链接返回该系列的第一篇文章,了解如何使用“彩色 Petri 网”正确建模。这不是你的想法(而且很容易)!

      OMG 中有一个新的进程内标准,用于一种名为 Alf 的语言,它为活动图提供了更方便的表面表示法,并且用于表示代码。来自规范:

      动作语言的主要目标是充当指定可执行文件的表面符号 更广泛的模型中的行为,该模型主要使用通常的图形符号表示 UML。例如,这可能包括关于类的操作或过渡效果的方法 状态机上的行为。

      对于程序员来说,您可能无法比 Alf 更直观。它会完美地转换成 UML 活动图。

      【讨论】:

        【解决方案8】:

        UML 的强项是描绘静态结构。如果您使用短期线程,我也看不到任何简单的方法来绘制它们。也许你可以通过扭转局面找到解决方案:你为什么使用/需要线程?他们提供的功能是什么?如果它们相互交互并遵循某些(消息传递)API,则将它们绘制为组件可能是有意义的。

        【讨论】:

          猜你喜欢
          • 2012-11-10
          • 1970-01-01
          • 1970-01-01
          • 2018-06-06
          • 1970-01-01
          • 2011-10-24
          • 2011-06-25
          • 2011-05-23
          • 1970-01-01
          相关资源
          最近更新 更多