0

私の宿題は、チェス盤の上を数人のキングが移動するゲームを作らなければなりません。各キングは、独自のスレッドで独自の開始位置から一意の終了位置に移動する必要があります。キングは移動を行う前に、最大 10 ミリ秒 (多少のランダム性) スリープし、他のプレイヤーが移動するのを待つ必要があります。

私は王がお互いに動きをするのを待っているという問題を で解決しましたが、問題は王のCyclicBarrier1 人が自分の終了位置に到達して自分のスレッドを停止したときに発生します。次にCyclicBarrier、スレッドが await() メソッドを呼び出すのを待っていますが、スレッドが実行されていないため、それは決して起こりません。

助言がありますか?

4

1 に答える 1

1

はい。Java7に付属のPhaserを使用してください。これは高度なCycliclBarrierです。

CyclicBarrierを直接模倣するには、この方法でPhaserを使用します。

Phaser phaser = new Phaser(n);

public void doWorkAndAwait(){
   //work
   phaser.arriveAndAwaitAdvance(); //await for all threads to arrive
}

到着したPhaserに通知したいが、事前に待たない場合は、単純にarrive()

public void doWorkAndContinue(){
   //work
   phaser.arrive();
   //stop own thread
}

この時点で、Phaserはスレッドが到着したことを通知されていますが、スレッドはstop own thread他のスレッドが到着するのを待たずにできます。

于 2012-06-08T14:04:04.163 に答える