it-swarm.dev

UML-Diagramme von Multithread-Anwendungen

Für Single-Threaded-Anwendungen verwende ich gerne Klassendiagramme, um einen Überblick über die Architektur dieser Anwendung zu erhalten. Diese Art von Diagramm war jedoch nicht sehr hilfreich, wenn versucht wurde, Anwendungen mit mehreren Threads/gleichzeitigen Anwendungen zu verstehen, z. B. weil verschiedene Instanzen einer Klasse in verschiedenen Threads "live" sind (was bedeutet, dass der Zugriff auf eine Instanz nur von der einen gespeichert wird Thread, auf dem es lebt). Folglich bedeuten Assoziationen zwischen Klassen nicht unbedingt, dass ich Methoden für diese Objekte aufrufen kann, sondern ich muss diesen Aufruf für den Thread des Zielobjekts ausführen.

Die meiste Literatur habe ich zu diesem Thema ausgegraben, z. B. Entwerfen gleichzeitiger, verteilter und Echtzeitanwendungen mit UML von Hassan Gomaa = hatte einige nette Ideen, wie das Zeichnen von Fadengrenzen in Objektdiagramme, aber insgesamt schien es ein bisschen zu akademisch und wortreich, um wirklich nützlich zu sein.

Ich möchte diese Diagramme nicht als allgemeine Ansicht der Problemdomäne verwenden, sondern als detaillierte Beschreibung meiner Klassen/Objekte, ihrer Interaktionen und der Einschränkungen aufgrund der oben erwähnten Thread-Grenzen.

Ich würde daher gerne wissen:

  1. Welche Arten von Diagrammen haben sich für das Verständnis von Multithread-Anwendungen als am hilfreichsten erwiesen?
  2. Gibt es Erweiterungen für klassische UML, die die Besonderheiten von Multithread-Anwendungen berücksichtigen, z. durch Anmerkungen, die veranschaulichen, dass
    • einige Objekte leben möglicherweise in einem bestimmten Thread, während andere keine Thread-Affinität haben.
    • einige Felder eines Objekts können aus einem beliebigen Thread gelesen, aber nur aus einem geschrieben werden.
    • einige Methoden sind synchron und geben ein Ergebnis zurück, während andere asynchron sind und Anforderungen in die Warteschlange stellen und Ergebnisse beispielsweise über einen Rückruf in einem anderen Thread zurückgeben.
25
PersonalNexus

Die wichtigsten Erkenntnisse darüber, wie Thread-Ausführungen stattfinden, können durch das sogenannte Sequenzdiagramm dargestellt werden. Hier ist ein Beispiel aus wikipedia

enter image description here

Dieses Diagramm zeichnet im Wesentlichen die Liste der Ereignisse zusammen mit einer Richtung über eine vertikale einzelne Linie, die häufig als Lebenslinie bezeichnet wird. In diesem Fall ist jeder Thread Eigentümer seiner eigenen Lebenslinie. Das Diagramm ermöglicht die Darstellung aller Arten von Ereignissen wie synchron, asynchron usw.

Das andere wichtigste in solchen Systemen sind die Zustandsdiagramme oder Zustandsdiagramme. Dies gilt normalerweise nur, wenn das Modell als Zustandsmaschine dargestellt wird. In den meisten Multithread-Systemen (in denen Threads nicht trivial sind) ist es jedoch am besten, wenn sie so konzipiert sind, dass sie mit isolierten Algorithmen für verschiedene Zustände funktionieren.

Es gibt andere Diagrammtypen wie Interaktionsdiagramm und Kommunikationsdiagramm , aber ich denke Wenn Sie versuchen, Sequenzdiagramme und Zustandsdiagramme zu zeichnen, erhalten Sie maximale Klarheit.

12
Dipan Mehta

Meine Antwort ist insofern komplementär zu Dipans , als es sich um UML-Sequenzdiagramme handelt. Ich fand, dass ein Stil, der nicht 100% reines UML ist, auch in Ordnung ist. Schauen Sie sich die in Parallelitätsmuster verwendeten Diagramme an. Einige sind fast UML-ähnlich (aber dieser ist definitiv nicht Standard):

enter image description here

Wenn Sie mit Warten/Benachrichtigen in Java Thread-Synchronisation vertraut sind, werden Sie das folgende Sequenzdiagramm aus dem von mir erwähnten Dokument zu schätzen wissen:

enter image description here

6
Fuhrmanator

Bei Anwendungen mit mehreren Threads, die dieselbe Klasse verwenden, könnte der Trick darin bestehen, dieselbe Klasse per Drag & Drop in jedes Modell zu ziehen, das einen Thread darstellt. Sie können dieselbe Klasse mit unterschiedlichen Ansichten haben und im Modell und Code navigieren, indem Sie auf die Klasse, das Diagramm oder den Code klicken. Ich weiß, dass die Modellzusammenführung kein bekanntes Konzept ist, aber in Eclipse mit Omondo sehr gut funktioniert.

Ich meine das, wenn ich eine große Anwendung modelliere, die aus mehr als einem Projekt besteht. Ich erstelle für jedes Projekt ein Modell und füge sie dann in einem größeren Projekt zusammen. Die gesamte Modellierung erfolgt mithilfe von Klassendiagrammen. Dies ist das Modell, das ich beim Umkehren des vollständigen Projekts von Java Code zu UML) erhalten habe. Ich meine, dass ich in meinem Beispiel vorhandenen Code verwende und ihn in einen einzigen umkehre UML-Modell und führen Sie dann den gesamten umgekehrten Code, der UML-Modelle erstellt hat, zu einem einzigen großen Modell zusammen. Sie können auch mehrere Modelle erstellen, anstatt vorhandenen Code umzukehren. Dies funktioniert in beide Richtungen - bei der Erstellung ohne Code oder beim Reverse Engineering mit vorhandenem Code.

Ich weiß nicht, ob es sinnvoll ist, aber Sie könnten vielleicht ein großes Modell erstellen und die Untermodelle für jeden Thread neu gruppieren, wie ich es mit der Modellierung mehrerer Projekte mache. Ich hoffe das hilft.

0
UML_GURU