【发布时间】: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