Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFx-防止UI在等待InetAddress超时时挂起_Java_Multithreading_Javafx_Concurrency - Fatal编程技术网

JavaFx-防止UI在等待InetAddress超时时挂起

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

我的JavaFX程序在ListView中有一个IP地址列表,我想周期性地遍历每个地址并调用每个地址。问题是每个调用都有一个相关的超时,这意味着程序在等待不可用地址的超时时挂起。解决这个问题的自然方法是线程,但是我想不出一种方法来阻止UI挂起。我已经试过了,我已经试过了一个在新线程的计时器上运行的计时器任务。我觉得我错过了一些明显的东西

使用JavaFX并发:

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();