我需要在我的程序中不断更新数据,所以我认为通过使用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
方法中声明的。
但是,在运行此程序时,即使任务在单独的线程上运行,任务也是唯一运行的。为什么会这样做而不是按预期运行?
答案 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());
}));
}
}
如果过于频繁地发布更新,这也会使应用程序无法响应。