【问题标题】:JavaFx - prevent UI from hanging while waiting on a timeout from InetAddressJavaFx - 防止 UI 在等待 InetAddress 超时时挂起
【发布时间】:2017-09-19 11:15:41
【问题描述】:

我的 JavaFX 程序在 ListView 中有一个 IP 地址列表,我想定期遍历每个地址并在每个地址上调用 INetAddress.isReachable。问题是每个调用都有一个关联的超时,这意味着程序在等待超时以获取不可用地址时挂起。对此的自然解决方案是线程,但是我无法找到阻止 UI 挂起的方法。我已经尝试过JavaFx's concurrent package 并且我已经尝试过在新线程中的计时器上运行的计时器任务。我觉得我在这里遗漏了一些明显的东西。

使用 JavaFX 并发:

Task task = new Task() {
    @Override
    protected Object call() throws Exception {
        while(true) {
            checkEachIP();
            Thread.sleep(5000);
        }
    }
};

new Thread (task).start();

【问题讨论】:

  • 听起来是使用 Executors Framework 的好人选。 (虽然我没有使用 JavaFX 的经验。)这样每次检查都可以是一个单独的任务。
  • 这似乎是一个不错的介绍:winterbe.com/posts/2015/04/07/…
  • checkEachIP() 在做什么?
  • 我实际上是在强制更新 ListView 中的每个单元格以调用自定义回调,根据 INetAddress.isReachable() 的布尔返回值,使每个单元格的文本颜色变为红色或绿色。我想我会忽略它,因为这个问题似乎没有必要 - 通过每个单元格的更新调用检查 ip 也感觉很糟糕,但想不出另一种方法来做到这一点。
  • 好的,但是checkEachIP() 在线程方面做了什么?由于您是从后台线程调用它,因此您显然无法从调用该方法的当前线程更新单元格(无论如何您正在这样做);所以你必须将代码委托给那里的某个地方的 UI 线程。无论如何,听起来你已经知道你正在以错误的方式解决这个问题 - 你应该首先解决潜在的问题(即你应该更新模型,而不是细胞,并让细胞观察模型)。

标签: java multithreading javafx concurrency


【解决方案1】:

如果您只想让任务在后台运行:

变化:

new Thread (task).start();

收件人:

Thread thread = new Thread (task);
thread.setDaemon(true); // will run in the background
thread.start();

【讨论】:

  • 这是不正确的。守护线程和非守护线程的唯一区别是前者不会阻止 jvm 在运行时关闭。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2018-06-12
  • 2022-08-20
相关资源
最近更新 更多