我创建了一个网络游戏。我遇到(似乎)无法解释的错误问题。请注意,单击鼠标时会将卡添加到ArrayList中,并且此类在其自己的线程上运行。
private void waitForAction(){
tb.report("Waiting for user to make a move...");
selectedCards = new ArrayList<Card>();
while(selectedCards.size() < 2){
if(selectedCards.size() == 2)//Wtf is going on here...?
tb.report("This loop is (not) broken.");
else
tb.report("Looping..");
};
tb.report("This player has selected 2 cards.");
}
当我删除else语句时,循环永远不会退出,这是print(report())方法向我证明的。我在早期开发中遇到了同样的问题,但是通过添加if-else语句的if部分来纠正它。我老老实实感到困惑,逻辑推理告诉我JVM没有检查条件,因为线程没有运行,但是在整个程序中我只调用一次Thread的start(),否则我的代码不会触及它。任何更明智的人的意见将不胜感激。
答案 0 :(得分:1)
如果没有更多信息,很难确切地告诉您出了什么问题。但是,我强烈建议您在更多基于事件的模型中编写服务器。特别是考虑到它是纸牌游戏,所以我猜测它是基于转向而不是实时的。
不要采用基于循环的方法,请尝试以下方法:
答案 1 :(得分:1)
您有多线程环境。 ArrayList不是threadSafe集合 - 它不保证其他线程的可见性。这意味着您的等待线程永远不会看到集合中的更改。
尝试使用java.util.concurrency的一些集合。