Robocode的每個機器人都是一個線程,線程調度為非強占式,由戰斗治理線程依次調度運行。每個線程執行到一個阻塞函數的時候,交出cpu占用權。對於AdvancedRobot,阻塞函數是excute()。
從這個角度而言,可以把robocode看作是回合制的游戲,每個回合各個robot設定要做些什麼操作,即調用setXXX(),調用excute()完成本回合的操作設定。各個robot都設定完後,戰斗模擬模塊模擬執行各個robot的動作,並且在屏幕顯示結果。下個回合,robot線程在excute()下面繼續執行,直到再次調用excute()為止。
不過,setXXX()設定的操作,往往是在一個回合中執行不完的。在robocode中,一個回合是游戲中的一個時間單位,各個元素的運動都有一定的速度,需要一定單位的時間才能完成。假如上回合中設置的動作還沒有完成,本回合又重新設定了,就會把新動作覆蓋舊動作。
事件處理函數onXXX(),看起來是在事件發生的時候立即執行的,其實不然,還是要在回合中輪到這個robot的時候才能執行。而且若在隊列中有多個事件,而某個事件處理函數調用了excute()結束了本回合的動作,那麼剩下的事件就要等到下個回合才能處理了。因此,onXXX()改變的只是某個線程內部的執行次序,並不改變robot線程之間的執行次序。