W przypadku aplikacji jednowątkowych lubię korzystać ze schematów klas, aby uzyskać przegląd architektury tej aplikacji. Ten typ diagramu nie był jednak bardzo pomocny, gdy próbowano zrozumieć mocno wielowątkowe / współbieżne aplikacje, na przykład ponieważ różne instancje klasy „działały” w różnych wątkach (co oznacza, że dostęp do instancji jest zapisywany tylko z jednej wątek, w którym żyje). W związku z tym powiązania między klasami niekoniecznie oznaczają, że mogę wywoływać metody na tych obiektach, ale zamiast tego muszę wywoływać to w wątku obiektu docelowego.
Większość literatury, którą odkopałem na ten temat, na przykład Projektowanie aplikacji współbieżnych, rozproszonych i czasu rzeczywistego za pomocą UML autorstwa Hassana Gomyi, miało kilka fajnych pomysłów, takich jak rysowanie granic wątków w diagramach obiektów, ale ogólnie wydawało się to zbyt akademickie i trudne do zrobienia być naprawdę przydatnym.
Nie chcę używać tych diagramów jako ogólnego widoku problematycznej domeny, ale raczej jako szczegółowy opis moich klas / obiektów, ich interakcji i ograniczeń wynikających z granic wątków, o których wspomniałem powyżej.
Chciałbym zatem wiedzieć:
- Jakie rodzaje diagramów są najbardziej pomocne w zrozumieniu aplikacji wielowątkowych?
- Czy są jakieś rozszerzenia klasycznego języka UML, które uwzględniają specyfikę wielowątkowych aplikacji, np. Za pomocą adnotacji ilustrujących
- niektóre obiekty mogą żyć w pewnym wątku, podczas gdy inne nie mają powinowactwa do wątku;
- niektóre pola obiektu mogą być odczytywane z dowolnego wątku, ale zapisywane tylko z jednego wątku;
- niektóre metody są synchroniczne i zwracają wynik, podczas gdy inne są asynchroniczne, które powodują umieszczanie żądań w kolejce i zwracają wyniki, na przykład poprzez wywołanie zwrotne w innym wątku.
źródło
Odpowiedzi:
Najważniejszy wgląd w sposób wykonywania wątków można przedstawić za pomocą tak zwanego diagramu sekwencji . Oto przykład z wikipedii
Ten diagram zasadniczo rysuje listę zdarzeń wraz z kierunkiem nad pionową pojedynczą linią, często nazywaną liną ratunkową . W takim przypadku każdy wątek jest właścicielem własnej linii życia. Schemat umożliwia reprezentację wszystkich rodzajów zdarzeń, takich jak synchroniczne, asynchroniczne itp.
Inną najważniejszą rzeczą w takich systemach są wykresy stanów lub diagramy stanów. Zwykle ma to zastosowanie tylko wtedy, gdy model jest reprezentowany jako maszyna stanu. Jednak w większości systemów wielowątkowych (gdzie wątki nie są trywialne) najlepiej jest zaprojektować je do działania z izolowanymi algorytmami dla różnych stanów.
Istnieją inne typy diagramów, takie jak schemat interakcji i schemat komunikacji, ale myślę, że próba narysowania schematu sekwencji i diagramów stanu zapewni maksymalną jasność.
źródło
Moja odpowiedź jest komplementarna do odpowiedzi Dipana , ponieważ obejmuje diagramy sekwencji UML. Odkryłem, że styl, który nie jest w 100% czysty UML, jest również OK. Spójrz na diagramy używane we wzorcach współbieżności . Niektóre są prawie podobne do UML (ale ten zdecydowanie nie jest standardem):
Jeśli znasz synchronizację wątków Java z oczekiwaniem / powiadomieniem, docenisz następujący schemat sekwencji z dokumentu, o którym wspomniałem:
źródło
W przypadku aplikacji wielowątkowych używających tej samej klasy sztuczką może być przeciągnięcie i upuszczenie tej samej klasy do każdego modelu reprezentującego wątek. Będziesz mógł mieć tę samą klasę z różnymi widokami i poruszać się po modelu i kodzie, klikając klasę, diagram lub kod. Wiem, że scalanie modeli nie jest dobrze znaną koncepcją, ale działa naprawdę dobrze w Eclipse z Omondo.
Mam na myśli to, że kiedy modeluję dużą aplikację, która składa się z więcej niż jednego projektu. Tworzę model dla każdego projektu, a następnie scalam je w większym projekcie. Całe modelowanie odbywa się za pomocą diagramów klas, czyli modelu, który otrzymałem podczas odwracania pełnego projektu z kodu Java do UML. Mam na myśli, że w moim przykładzie używam istniejącego kodu i przekształcam go w pojedynczy model UML, a następnie łączę cały ten kod zwrotny, który utworzył modele UML w jeden duży model. Możesz także utworzyć wiele modeli zamiast odwracać istniejący kod. Działa w obie strony - podczas tworzenia bez kodu lub na etapie inżynierii wstecznej z istniejącym kodem.
Nie wiem, czy to ma sens, ale może mógłbyś stworzyć jeden duży model, przegrupowując pod modele dla każdego wątku, tak jak robię to z modelowaniem wielu projektów? Mam nadzieję, że to pomoże.
źródło