我有一个JavaFX应用程序,该应用程序运行多个执行大量计算的线程。问题是,经过一段时间的UI完全冻结,但我只更新Platform.runLater()使用Platform.runLater()使用多线程的JavaFX UI冻结()
的UI我开始我的主线程派生的线程的休息方式:
mainThread = new MainThread(mc);
mainThread.start();
在这里我给线程引用主控制器,它将这个引用传递给其余的线程,以便他们可以将内容打印到TextArea。
主线程产卵一次只有2子线程,但是这两个子线程使用的ExecutorService用线程的配置数量(100+):
executor = Executors.newFixedThreadPool((Integer.valueOf(mainController.getIndexController().getThreadsField().getText())));
for(int i = 0; i < newTasks.size(); i++){
Runnable slaveThread = new SlaveThread(dataLink, url);
executor.execute(slaveThread);
}
现在线程做很多东西,如下载文件,但我想这应该不会影响用户界面。他们偶尔从界面读取,但这不应该是问题。
我认为通过使用platform.runlater(),UI不能被冻结。
Platform.runLater(() -> {
mainController.getIndexController().writeToConsole(result);
});
因为我没有任何其他修改UI的代码,所以这肯定是问题所在。该程序执行许多Platform.runLater() - s,这是否太多? 或多少太多?还有其他一些平滑UI的应用程序,比我的更频繁地更新界面方式,并且运行得很好。可能是什么问题?谢谢。
那么这意味着一些更新将会丢失? – Joey
一些个人更新不会被执行,这是正确的。但是,由于您的更新正在更新UI,因此无论如何都不希望更新它们的频率。即如果在将文本设置为''文本'之间没有任何框架被渲染,你不想做'label.setText(“X”)','label.setText(“Y”)','label.setText(“Z” “X”并将其设置为“Z” - 中间更新永远不会被用户看到。 –