有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing何时无事可做,java中是否没有更新?那可能是个虫子?

我正在开发一个游戏,如果窗口失去焦点,什么会停止。问题是当焦点获得时,它不会开始。我简化了游戏的这一部分,下面是代码:

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);
}
}

输出:

running

running

...

focus lost

focus gained

在“获得关注”之后,我希望再次写下这一批

如果我在while(true)中加入一些东西,比如一个系统,那么游戏就可以运行了。出来println:

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

输出:

running

while true

running

while true

...

focus lost

while true

while true

...

focus gained

running

while true

running

while true

...

我不想把那个系统。出来打印行或其他任何东西,因为它使用处理器

那么你知道如何修复这个“bug”吗


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    乍一看,你需要同步

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

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

    READ - MODIFY- WRITE can't be achieved with volatile

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