JavaFx-防止UI在等待InetAddress超时时挂起
我的JavaFX程序在ListView中有一个IP地址列表,我想周期性地遍历每个地址并调用每个地址。问题是每个调用都有一个相关的超时,这意味着程序在等待不可用地址的超时时挂起。解决这个问题的自然方法是线程,但是我想不出一种方法来阻止UI挂起。我已经试过了,我已经试过了一个在新线程的计时器上运行的计时器任务。我觉得我错过了一些明显的东西 使用JavaFX并发:JavaFx-防止UI在等待InetAddress超时时挂起,java,multithreading,javafx,concurrency,Java,Multithreading,Javafx,Concurrency,我的JavaFX程序在ListView中有一个IP地址列表,我想周期性地遍历每个地址并调用每个地址。问题是每个调用都有一个相关的超时,这意味着程序在等待不可用地址的超时时挂起。解决这个问题的自然方法是线程,但是我想不出一种方法来阻止UI挂起。我已经试过了,我已经试过了一个在新线程的计时器上运行的计时器任务。我觉得我错过了一些明显的东西 使用JavaFX并发: Task task = new Task() { @Override protected Object call() th
Task task = new Task() {
@Override
protected Object call() throws Exception {
while(true) {
checkEachIP();
Thread.sleep(5000);
}
}
};
new Thread (task).start();
如果您只希望任务在后台运行: 更改:
new Thread (task).start();
致:
听起来像是一个很好的候选人雇用执行者框架。(虽然我没有JavaFX的经验。)这样,每个检查都可以是一个单独的任务。这似乎是一个不错的介绍:什么是
checkEachIP()
do?我实际上是在强制更新ListView中的每个单元格,以调用一个自定义回调,根据INetAddress.isReachable()返回的布尔值,使每个单元格的文本颜色变为红色或绿色。我想我还是不提了,因为这个问题似乎没有必要——通过每个单元格的更新调用检查ip也感觉很糟糕,但想不出其他方法。好吧,但是checkeeachip()
在线程方面做了什么?由于您是从后台线程调用它,因此显然无法从调用该方法的当前线程更新单元格(无论您是如何操作的);因此,您必须将代码委托给其中的某个UI线程。无论如何,听起来你已经知道你的方法是错误的-你可能应该首先修复潜在的问题(即,你应该更新模型,而不是单元格,让单元格观察模型)。这是错误的。守护进程线程和非守护进程线程之间的唯一区别在于前者不能阻止jvm在运行时关闭。
Thread thread = new Thread (task);
thread.setDaemon(true); // will run in the background
thread.start();