This is probably a safer version.&nbsp; It works for me.<br><br>semA := Semaphore new.<br>semB := Semaphore new.<br><br>thread1 := [Transcript cr; nextPutAll: &#39;b1&#39;. semB signal. semA wait.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transcript cr; nextPutAll: &#39;b2&#39;. ] fork.
<br>thread2 := [Transcript cr; nextPutAll: &#39;a1&#39;. semA signal. semB wait.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transcript cr; nextPutAll: &#39;a2&#39;.] fork.<br><br>[thread1 isTerminated and: [thread2 isTerminated]] whileFalse: <br>&nbsp;&nbsp;&nbsp; [(Delay forMilliseconds: 100) wait].
<br>Transcript flush<br><br>Now to move on to another pattern.<br><br>JTS<br>