我正在开发一个游戏,如果窗口失去焦点,它将停止。问题是当获得焦点时,它就不会开始。我简单地确定了游戏的那一部分,下面是代码:
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或其他东西,因为它使用了处理器...
那么您知道一些可以解决此“错误”的信息吗?
答案 0 :(得分:2)
尝试将volatile
添加到running
的定义中。我认为问题在于,一旦检测到running == false
,它就会缓存该值,而不再检查内存。
答案 1 :(得分:0)
乍一看,您需要同步
如果只有一个线程正在编写布尔值,则可以使用volatile (通常,您这样做是为了定义在线程的主循环中检查的停止变量)。
如果您有多个线程在修改布尔值,则应该使用同步
读取-使用volatile无法实现MODIFY-WRITE
https://jorosjavajams.wordpress.com/volatile-vs-synchronized/