循环和......线程?

时间:2015-04-09 04:49:09

标签: java multithreading loops if-statement

我创建了一个网络游戏。我遇到(似乎)无法解释的错误问题。请注意,单击鼠标时会将卡添加到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(),否则我的代码不会触及它。任何更明智的人的意见将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

不要采用基于循环的方法,请尝试以下方法:

  1. 服务器会保留游戏当前状态的模型。
  2. 客户端向服务器发送消息。一个这样的消息可以是&#34;玩牌XYZ&#34;
  3. 服务器处理消息并相应地更新模型。如果用户玩了一张卡片,它可能会从该人的手中取出该卡片。它可能会根据卡的效果改变其他状态。收到消息后,将处理所有逻辑。
  4. 状态更改将发送给所有客户端,以便他们看到与服务器状态一致的视图。

答案 1 :(得分:1)

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

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