首页 > 解决方案 > 在线程中运行时循环不起作用

问题描述

所以基本上我试图让这个while循环在这个线程中运行,它应该在“激活”评估为真时激活,但由于某种原因它不起作用。“激活”是布尔值,当用户按下鼠标按钮时激活(我为此设置了监听器)。如果有人想知道我在这个项目中使用 jnativehook 库。任何帮助或解释将不胜感激。

private boolean activate;
private Robot robot;


@Override
public void run() {
    try {
        robot = new Robot();
    } catch (AWTException e) {
        e.printStackTrace();
    }

    while(true) {
        if (activate == true) {
            robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
            robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
            robot.delay(100);
        }
    }       
}

标签: javamultithreadingmouseeventjnativehook

解决方案


一种可能性是编译器(Java 编译器或 JIT 编译器)已决定不需要测试activate,因为它可以证明while循环内没有任何东西会改变它。在大多数编译型编程语言中,编译器被允许假设代码是单线程的,除非你做一些特别的事情来告诉它。这个假设是合理的,因为它使编译器能够在大多数时间生成更高效的代码。

synchronized块中访问变量或将变量声明为volatile将阻止编译器做出该假设。

更好的是使用private final AtomicBoolean activate;.


推荐阅读