JavaFX:在单独的线程中运行任务不允许运行任何其他任务

时间:2016-07-30 08:41:52

标签: java multithreading javafx

我需要在我的程序中不断更新数据,所以我认为通过使用JavaFX的任务,我可以让它在我的程序中作为一个单独的进程运行。

final Task task = new Task<Void>() {
    @Override
    protected Void call() throws Exception {
        Platform.runLater(() -> {
            while (true) {
                itemData.forEach(data -> {
                    System.out.println(data.getId());
                });
            }
        });
        return null;
    }
};
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();

这是在initialize接口提供的Initializable方法中声明的。

但是,在运行此程序时,即使任务在单独的线程上运行,任务也是唯一运行的。为什么会这样做而不是按预期运行?

1 个答案:

答案 0 :(得分:2)

您只是开始一项任务,只是用它在UI线程上发布一个长时间运行的任务。 Runnable

() -> {
    while (true) {
        itemData.forEach(data -> {
            System.out.println(data.getId());
        });
    }
}

仍在应用程序线程上运行,阻止它。

只应在应用程序线程上进行UI更新。繁重的工作应该在另一个线程上完成。

您应该仅在应用程序线程上发布更新。像这样:

@Override
protected Void call() throws Exception {
    while (true) {
        try {
            // add a pause between updates
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
        }
        Platform.runLater(() -> itemData.forEach(data -> {
            System.out.println(data.getId());
        }));
    }
}

如果过于频繁地发布更新,这也会使应用程序无法响应。