JavaFX:在单独的线程中运行任务不允许其他任何运行
问题描述:
我需要在程序中更新数据,所以我认为通过使用JavaFX的Task,我可以让它运行为单独的过程在我的程序中。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();
这在由Initializable
接口提供的initialize
方法被声明。
但是,运行此程序时,即使该任务在单独的线程上运行,该任务仍是唯一运行的任务。为什么它会这样做,而不是像预期那样运行?
答
你只是开始一个任务,只用它来在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());
}));
}
}
如果您发布更新太频繁,这也可能导致应用程序无响应。