Java代码没有println就无法工作

时间:2018-05-15 04:31:58

标签: java

这是我的代码:

while(monster.curHp > 0)
{
    System.out.println("");
    if(battle.pressedButton)
    {
        text = Player.name + ": " + Player.curHitPoints + "     " + monster.name + ": " + monster.curHp;
        battle = new GUIForBattle(text,Player,monster);
    }
}

奇怪的是,如果我在while循环中有println行,代码将正常工作,当按下按钮时,我们将更新文本以获得当前状态,我们将使用GUIForBattle类重绘GUI,但是如果我没有那个println就不会重绘。有什么建议?谢谢!

以下是更多上下文的GUIForBattle

public class GUIForBattle extends JFrame {
boolean pressedButton = false;
public GUIForBattle(String words, player PlayerOne, Monster monster)
{
    JFrame frame = new JFrame(); //frame that holds everything
    JPanel Panel = new JPanel(new GridLayout(5,5)); //panel where things get added
    JLabel text = new JLabel(words); // text label
    JButton attack = new JButton("Attack"); //makes a button used to attack
    //adding what pressing the attack button would do 
    attack.addActionListener(
            new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    int attackAmount = PlayerOne.weaponEquipped.att;
                    monster.curHp = monster.curHp - attackAmount;
                    pressedButton = true;
                }
            }
            );
    JButton Item = new JButton("Item"); // makes a button used to use items
    Item.addActionListener(
            new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    //we need to make a item interface
                }
            });
    Panel.add(text); //adds the text to the panel
    Panel.add(attack);
    Panel.add(Item);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800, 800); //setting size of frame
    frame.add(Panel); //adding the panel to frame
    frame.setVisible(true); //making the frame visible
}

}

1 个答案:

答案 0 :(得分:1)

您的代码本质上是多线程的;一个线程正在运行那个小while循环;另一个是将处理你的swing事件处理程序的swing应用程序线程。

如果你使用这样的共享变量(两个线程都访问pressedButton),你需要确保变量在线程之间同步。有几种方法可以解决这个问题,但解决这个问题的一个简单方法就是使变量变为volatile。

如果变量未以任何方式同步,则JVM无法保证一个线程何时会看到'另一方对它做出的改变。通常情况下,如果你让一个线程占用就像你在这里做的那样(这个循环称为忙等待)它永远不会花时间进行同步,你永远不会看到更新。

println是一个IO操作,这意味着在某些时候你的线程将等待IO完成。这很可能导致JVM同步变量,这就是你注意到这种差异的原因。

在任何情况下,依赖于此而不考虑同步可被视为错误。

Java线程和内存处理是一个复杂的主题,而不是我建议初学者跳入的东西;它可能是压倒性的。现在尝试避免在线程之间共享内存。目前,只需在你的应用程序代码中运行你的逻辑(它不是理想的,但对于一些初学者代码,它可能是一个很好的起点)。

如果您准备好了,请阅读the memory model and what it implies for multi-threading