2012-01-29 27 views
1

我有一个计时问题,我不知道如何解决它。我的纸牌游戏服务器中的Java线程计时问题

在我的第二个循环显示卡中,​​它循环,每个连接开始一个名为cLookAtCardConnection的类。这个类有时会设置标志mPlayerList.GetNextFlag(),从而导致循环退出,并使程序进入到第一循环,打开卡上,它调用类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 
+4

重新命名为'cLookAtCardConnection'的类以及诸如'WaitForAllPlayers()'等方法。 1)请学习常用的Java术语并使用它。 2)一个名为'cLookAtCardConnection'的类有一个不好的设计气味。类名应该是名词(专有名词),而不是动词(做'看'等词)。 – 2012-01-29 07:21:09

+0

另外,也许你应该考虑改进代码中的评论 - “退出一个非常糟糕的错误”似乎不是一个有用的评论 – Dawood 2012-01-29 07:23:54

回答

2

你可能需要建立一个​​块,使得do-while循环内的代码仅仅是在一个时间一个线程访问。