java - while 循环未执行

标签 java multithreading

我正在开发一个 java 项目,其中外部微 Controller 设备通过串行端口连接到计算机。我在 java 应用程序中有一个等待对话框,等待命令在微 Controller 设备上执行。如果微 Controller 在 10 秒内没有响应,应用程序将关闭。

问题是有些命令太快了,微 Controller 在等待对话框激活之前就响应了。这会导致应用程序在十秒后关闭。

这是我想到等待对话框可见的第一个想法:

new Thread() {
    public void run() {
         while (!Main.mainFrame.waitDialog.isVisible()) {}
         Main.usbManager.start();
    }
}.start();

但应用程序卡在 while 循环中并且等待对话框是可见的,但是如果我在 while 循环中添加一些随机语句,例如 System.out.flush();,它有效,当对话框可见时,程序从 while 循环中退出。

如何等待对话框可见?

谢谢

最佳答案

大多数 GUI 库都是单线程的。这意味着对它的调用可能不是线程安全的,你永远不能保证看到变化。特别是 boolean 值可以内联,因此您可以确定在某个点之后您不会看到值发生变化。

如果你使用的东西会减慢循环,它不会优化代码一段时间(这是不可靠的)或者像 System.out.flush() 那样有内存障碍,那么这个优化就不会发生。

更好的轮询方法可能是使用 Thread.yield()Thread.sleep(40) 来为自己节省一些 CPU。

关于java - while 循环未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38037965/

相关文章:

java - 与 Java Web 应用程序相关的初学者查询

java - 使用 Java 通过 http 批量下载图像的好方法

java - ThreadLocal 和非线程安全 API

java - 编译时由: android. database.sqlite.SQLiteException : near "": syntax error (code 1): ,引起:

java - 传递 Swing 组件 - NullPointerException

java - RecyclerView 正在复制列表中的前三个项目

java - 是否可以防止通过 Hibernate 读取数据库行?

python - 为什么这个脚本不能与线程 python 一起使用

java - 如何从进程中获取输出并设置超时?

java - Java 中 Go channel 的等价物