首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >While循环and...threads?

While循环and...threads?
EN

Stack Overflow用户
提问于 2015-04-09 12:49:09
回答 2查看 81关注 0票数 1

我已经创建了一个网络游戏。我遇到了(看似)无法解释的错误。请注意,卡片是在单击鼠标时由添加到ArrayList的,并且该类在其自己的线程上运行。

代码语言:javascript
复制
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()一次,否则我的代码不会触动它。索尔的任何更明智的意见都将非常受欢迎。

EN

回答 2

Stack Overflow用户

发布于 2015-04-09 13:24:34

如果没有更多的信息,就很难确切地告诉你出了什么问题。但是,我强烈建议您在更多的基于事件的模型中编写服务器。特别是考虑到这是一个纸牌游戏,所以我猜它是基于回合而不是实时的。

试着这样做,而不是做基于循环的方法:

  1. 服务器保存游戏当前状态的模型。
  2. 客户端向服务器发送消息。一个这样的消息可以是"play card XYZ“
  3. ,服务器处理该消息并相应地更新模型。如果用户打出了一张牌,它可能会将该牌从该人手中移走。它可能会根据卡片的效果改变一些其他状态。当消息为received.
  4. State时,将处理所有逻辑。

将更改发送到所有客户端,以便它们看到与服务器状态一致的视图。

票数 1
EN

Stack Overflow用户

发布于 2015-04-09 13:41:28

你有一个多线程环境。ArrayList不是一个threadSafe集合--它不保证在其他线程上的可见性。这意味着您的等待线程永远看不到集合中的更改。

尝试使用一些java.util.concurrency集合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29529995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档