我的纸牌游戏服务器中存在Java线程定时问题



我有一个时间问题,不知道如何解决。

在我的第二个循环Displaycard中,它循环,每个连接都启动一个名为cLookAtCardConnection的类。这个类有时会设置标志mPlayerList.GetNextFlag(),从而导致循环退出,程序进入第一个循环,Turn card over,它调用类cLookAtCardConnection

问题是,在设置了mPlayerList.GetNextFlag()之后,下一对连接仍在同一个循环中,并在设置了标志并进入调用cLookAtCardConnection的循环时调用类cLookAtCardConnection,而不是(退出?)循环。

为什么在设置了标志之后退出循环会有延迟?

while( lBoard.Next()==true)
        {
        mPlayerList.Next();
        // inner loop wait for all players
        /////////////////////////////////////////////////////////////////////////////
        // turn one card over
         mPlayerList.WaitForAllPlayers();
            do
            {
                    do{
                        r=GetClient();
                        switch(r)
                        {
                        case 0: return; // exitvon a very bad error
                        }
                    } while(r==2);// loop if it was a timeout               
                    cTurnCardOvrerConnection thread = new cLookAtCardConnection("thread3", connection, mPlayerList, mPlayersMessages, lBoard);
                } while( mPlayerList.AllPlayersFinished()==false);// end while
            //////////////////////////////////////////////////////////////////////////
            // Display card -LOOK AT CARD
            mPlayerList.ClearNextFlag();
             mPlayerList.WaitForAllPlayers();
            do
            {
                System.out.println(Thread.currentThread()+": Display card r");
                    do{
                        r=GetClient();
                        switch(r)
                        {
                        case 0: return; // exitvon a very bad error
                        }
                    } while(r==2);// loop if it was a timeout       
                    cLookAtCardConnection thread = new cLookAtCardConnection("thread3", connection, mPlayerList, mPlayersMessages, lBoard);
// after this flag is set the next couple connectons are still in this loop???      
            } while( mPlayerList.GetNextFlag()==false);// end while
        } // reloop game board
    } // loop forever   
    //      System.out.println("--------- Eit player loop ------------------- r"); 
        } catch(IOException ec)
        {
            System.out.println(ec.getMessage());            
        }

      } // end run
} // end of class

您可能需要设置一个synchronized块,以便do-while循环中的代码一次只能由单个线程访问。

最新更新