java - 在线程中运行时循环不起作用
问题描述
所以基本上我试图让这个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);
}
}
}
解决方案
一种可能性是编译器(Java 编译器或 JIT 编译器)已决定不需要测试activate
,因为它可以证明while
循环内没有任何东西会改变它。在大多数编译型编程语言中,编译器被允许假设代码是单线程的,除非你做一些特别的事情来告诉它。这个假设是合理的,因为它使编译器能够在大多数时间生成更高效的代码。
从synchronized
块中访问变量或将变量声明为volatile
将阻止编译器做出该假设。
更好的是使用private final AtomicBoolean activate;
.
推荐阅读
- angular - 如何使用角度5下载带有blob函数的文件
- swift3 - 同步发送多个 URLSession dataTask 请求并等待结束
- angular - 无法看到在 aws s3 存储桶中上传的网站
- python - Scrapy Piplines 处理数据
- reactjs - React-Native 如何处理来自平面列表中的项目的 onPress ???
- javascript - ChartJs 从数组创建图表
- bash - 从多行文件中获取子字符串
- plugins - 是否有任何 cms 类型的插件来连接静态网站?
- ruby-on-rails - 在 Rails 中使用正则表达式进行格式验证获取:'未定义的局部变量或方法'
- tensorflow - Tensorflow - Seq2Seq 模型权重未正确加载