当无事可做时,java中是否没有更新?那';可能是虫子吧?
我正在开发一个游戏,如果窗口失去焦点,什么会停止。问题是当焦点获得时,它不会开始。我简化了游戏的这一部分,下面是代码:当无事可做时,java中是否没有更新?那';可能是虫子吧?,java,swing,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
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);
}
}
输出:
运行
运行
焦点丢失
获得焦点
在“获得关注”之后,我希望再次写下这一批
如果我在while(true)中添加类似System.out.println的内容,则游戏可以运行:
while(true)
{
System.out.println("while true");
if(running)
{
System.out.println("running");
}
}
输出:
运行
虽然是真的
运行
虽然是真的
焦点丢失
虽然是真的
虽然是真的
获得焦点
运行
虽然是真的
运行
虽然是真的
我不想把System.out.printline或其他任何东西放进去,因为它使用处理器
那么您知道如何修复这个“bug”吗?尝试将
volatile
添加到running
的定义中。我认为问题在于一旦检测到running==false
,它就会缓存该值,并且不再检查内存。尝试将volatile
添加到running
的定义中。我认为问题在于,一旦检测到running==false
,它就会缓存该值,并且不再检查内存。乍看之下,您需要同步
- 如果只有一个线程正在写入布尔值,则可以使用volatile (通常这样做是为了定义在线程主循环中检查的停止变量)
- 如果有多个线程修改布尔值,则应使用同步
乍看之下,您需要同步
- 如果只有一个线程正在写入布尔值,则可以使用volatile (通常这样做是为了定义在线程主循环中检查的停止变量)
- 如果有多个线程修改布尔值,则应使用同步
哇,你击中了我的头。我刚刚确认了@ControlAltDel的答案。只需将
volatile
关键字添加到变量声明中,如他所说:static volatile boolean running=true代码>参考:哇,你真是一针见血。我刚刚确认了@ControlAltDel的答案。只需将volatile
关键字添加到变量声明中,如他所说:static volatile boolean running=true代码>参考: