让我们和你一起顺着流程的执行一起走。
以下是引用片段:
ClientExecution execution = processDefinition.startProcessInstance();
启动一个新执行意味着初始活动被执行。 所以如果一个自动活动是初始活动,这意味着第一个未命名的向外转移会被立刻选择。 这些都发生在startProcessInstance调用的内部。
然而在这种情况下,初始活动是一个等待状态。 所以startProcessInstance方法会立刻返回, 执行会定位到初始活动'wait 1'。 一个新执行会被定为到'wait 1'。

图 2. 一个新执行会被定为到wait 1。
然后一个外部触发器会执行signal方法。
以下是引用片段:
execution.signal();
像上面解释的介绍WaitState, signal会导致选择默认的转移。 转移会把执行移动到automatic 1活动,并执行它。 automatic 1中的Display活动的execute方法, 向控制台打印一行,它不会 调用execution.waitForSignal()。 因此,执行会通过选择automatic 1外部的默认转移进行执行。 在这种状态,signal方法一直阻塞着。另一个需要考虑的方式是执行方法, 像signal会使用客户端的线程 来拦截流程定义,直到到达一个等待状态。
然后执行到达wait 2, 执行WaitState活动。那个方法会调用 execution.waitForSignal(),这会导致signal方法返回。 线程会返回到调用signal方法 的客户端。
所以,当signal方法返回时,执行定义到wait 2。

图 3. 一个signal会把执行从initial带到wait 2。
然后执行会等待一个外部触发器, 像是一个对象(更准确的是一个对象图)在内存中, 直到下一个外部触发器执行signal方法。
以下是引用片段:
execution.signal();
第二个调用的signal会直接让执行进入wait 3, 在它返回之前。
第二个signal让执行进入'wait 3'。
一个signal会把执行从'initial'带到'wait 2'。

图 4. 第二个signal让执行进入wait 3。