Короче говоря
Это не написано черным по белому, но если вы раскошелиться, у вас будут некоторые ограничения, которые рано или поздно потребуют от вас присоединиться на практике. Существует только одна допустимая конструкция, которая позволяет вам избежать объединения на практике.
Более подробно
Это косвенное следствие параллельного потока токенов и правил его завершения.
В соответствии со спецификациями UML 2.5, финал потока имеет следующее поведение:
FlowFinalNode - это FinalNode, который завершает поток. Все токены, принятые FlowFinalNode, уничтожаются. Это не влияет на другие потоки в Деятельности.
Вы можете использовать его для поглощения токенов в одном из параллельных потоков, без влияния на другие ветви.
Аналогично, финал действия подчиняется следующему принципу:
ActivityFinalNode - это FinalNode, который останавливает все потоки в Activity. Токен, достигший ActivityFinalNode, принадлежащий Activity, прекращает выполнение этой Activity.
Но не существует правила, определяющего скорость каждого потока или то, что каждый поток будет выполнять все ожидаемые действия, если у вас нет соединения. Это проблема отсутствующей синхронизации.
Представьте, что у вас есть два разветвленных потока, которые остаются независимыми: каждый поток должен будет каким-то образом закончиться. Если у вас нет присоединения:
Если у действия есть более одного ActivityFinalNode, то первый, принявший токен (если есть), завершает выполнение действия, включая выполнение любых других ActivityFinalNodes ,
Таким образом, первый поток, который достигает финала активности, прервет текущую деятельность в других потоках, оставив производительность других потоков неполной.
Единственный способ обеспечить правильное окончание обеих ветвей без прерывания, поэтому иметь окончание потока в каждой ветви.
Если один из циклов потока у вас есть проблема умножения токенов du на параллельные потоки, которые повторно вводятся в схему (которые соответствуют параллельному выполнению).
Единственный способ избежать узла соединения - использовать неявное соединение:
ExecutableNode не должен выполняться, пока все входящие ControlFlow (если они есть) не предлагают токены. То есть существует неявное соединение для входящих потоков управления. Определенные c виды ExecutableNodes могут иметь дополнительные предварительные условия, которые должны быть выполнены, прежде чем узел сможет работать.
Но неявное или явное, это соединение ;-)