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

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

final Task task = new Task() { @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(); 

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

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

您只是开始一项任务,只是用它在UI线程上发布一个长时间运行的任务。 The 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()); })); } } 

如果您经常发布更新,这也会使应用程序无响应。