什么都不做,在Java中没有更新?那可能是个错误吗?

时间:2018-07-26 18:20:05

标签: java swing

我正在开发一个游戏,如果窗口失去焦点,它将停止。问题是当获得焦点时,它就不会开始。我简单地确定了游戏的那一部分,下面是代码:

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;

public class Main extends JFrame
{
    static boolean running = true;

public static void main(String[] args)
{
    Main main = new Main();
    main.frameSetup();

    while(true)
    {
        if(running)
        {
            System.out.println("running");
        }
    }
}

void frameSetup()
{
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(900, 600);

    addFocusListener(new FocusListener()
    {
        public void focusGained(FocusEvent e)
        {
            System.out.println("focus gained");
            running = true;
        }

        public void focusLost(FocusEvent areg0)
        {
            System.out.println("focus lost");
            running = false;
        }

    });

    setVisible(true);
}
}

输出:

  

运行

     

运行

     

...

     

失去焦点

     

获得焦点

在“获得关注”之后,我希望能再次写出很多。

如果我像System.out.println那样放一些东西(真),游戏就可以了:

while(true)
    {
        System.out.println("while true");
        if(running)
        {
            System.out.println("running");
        }
    }

输出:

  

运行

     

为真

     

运行

     

为真

     

...

     

失去焦点

     

为真

     

为真

     

...

     

获得焦点

     

运行

     

为真

     

运行

     

为真

     

...

我不想放那个System.out.printline或其他东西,因为它使用了处理器...

那么您知道一些可以解决此“错误”的信息吗?

2 个答案:

答案 0 :(得分:2)

尝试将volatile添加到running的定义中。我认为问题在于,一旦检测到running == false,它就会缓存该值,而不再检查内存。

答案 1 :(得分:0)

乍一看,您需要同步

  • 如果只有一个线程正在编写布尔值,则可以使用volatile (通常,您这样做是为了定义在线程的主循环中检查的停止变量)。

  • 如果您有多个线程在修改布尔值,则应该使用同步

  

读取-使用volatile无法实现MODIFY-WRITE

https://jorosjavajams.wordpress.com/volatile-vs-synchronized/