我已经创建了一个网络游戏。我遇到了(看似)无法解释的错误。请注意,卡片是在单击鼠标时由添加到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()一次,否则我的代码不会触动它。索尔的任何更明智的意见都将非常受欢迎。
发布于 2015-04-09 13:24:34
如果没有更多的信息,就很难确切地告诉你出了什么问题。但是,我强烈建议您在更多的基于事件的模型中编写服务器。特别是考虑到这是一个纸牌游戏,所以我猜它是基于回合而不是实时的。
试着这样做,而不是做基于循环的方法:
将更改发送到所有客户端,以便它们看到与服务器状态一致的视图。
发布于 2015-04-09 13:41:28
你有一个多线程环境。ArrayList不是一个threadSafe集合--它不保证在其他线程上的可见性。这意味着您的等待线程永远看不到集合中的更改。
尝试使用一些java.util.concurrency集合。
https://stackoverflow.com/questions/29529995
复制相似问题