私はJAVA、特に並行性にかなり慣れていないので、おそらく/うまくいけば、これはかなり単純な問題です。
基本的に私のメインスレッドから私はこれを持っています:
public void playerTurn(Move move)
{
// Wait until able to move
while( !gameRoom.game.getCurrentPlayer().getAllowMove() )
{
try {
Thread.sleep(200);
trace("waiting for player to be available");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
gameRoom.getGame().handle(move);
}
gameRoom.getGame() は独自のスレッドにあります。gameRoom.getGame().handle() は同期されています gameRoom.game.getCurrentPlayer() は gameRoom.getGame() の変数上にあり、同じスレッドにあります
allowMoves は、handle(move) が呼び出されるとすぐに false に設定され、移動の処理が完了すると true に戻ります。
playerTurn() を複数回呼び出します。私は実際に SmartFoxServer 拡張機能からそれを呼び出します。リクエストを受信すると、多くの場合、立て続けに呼び出します。
私の問題は、ほとんどの場合うまくいくことです。ただし、allowMoves が false である必要がある場合でも、複数のハンドル (移動) 呼び出しを発行している場合があります。それが再び真実になるのを待っていません。別のハンドル (移動) が呼び出される前に、ゲーム スレッドが allowMoves を設定する機会がなかった可能性があると考えました。allowMoves に volatile を追加し、ゲーム スレッドの関数が同期に設定されていることを確認しました。しかし、問題はまだ起こっています。
これらは私の Game クラスにあります:
synchronized public void handle(Object msg)
{
lastMessage = msg;
notify();
}
synchronized public Move move() throws InterruptedException
{
while (true)
{
allowMoves = true;
System.out.print(" waiting for move()...");
wait();
allowMoves = false;
if (lastMessage instanceof Move)
{
System.out.print(" process move()...");
Move m = (Move) lastMessage;
return m;
}
}
}
public volatile boolean allowMoves;
synchronized public boolean getAllowMoves()
{
return allowMoves;
}
私が言ったように、私はこれに不慣れで、おそらく自分よりも少し進んでいます(いつものように、深いところに飛び込むのが私のスタイルで、とにかく迅速な学習曲線には最適です).
あなたの助けに乾杯。