gpt4 book ai didi

multithreading - JavaFX UI使用Platform.runLater()使用许多线程卡住

转载 作者:行者123 更新时间:2023-12-03 12:59:53 25 4
gpt4 key购买 nike

我有一个JavaFX应用程序,该应用程序运行多个执行大量计算的线程。问题是,一段时间后UI完全冻结,但我仅使用Platform.runLater()更新了UI

我启动主线程的方式将生成其余线程:

mainThread = new MainThread(mc);
mainThread.start();

在这里,我给线程提供了对主 Controller 的引用,该 Controller 将该引用传递给其余线程,以便它们可以将内容打印到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 );
}

现在,线程做了很多事情,例如下载文件,但是我想那应该不会影响UI。他们偶尔会从界面中读取内容,但这不应该是问题。

我以为通过使用platform.runlater(),无法冻结UI。
 Platform.runLater(() -> {
mainController.getIndexController().writeToConsole(result);
});

由于我没有任何其他代码可以修改UI,因此这一定是问题所在。该程序执行很多Platform.runLater()-s,太多了吗?
还是多少太多了?还有其他具有平滑UI的应用程序,其界面更新方式比我的更频繁,并且运行良好。可能是什么问题?谢谢。

最佳答案

从您的问题中无法确切知道,但是听起来好像您通过调用Platform.runLater(...)太多次而将许多可运行对象调度到FX Application Thread。 “多少是多少”是不负责任的,因为它取决于许多因素,但是通常,您不应将它们安排得比消耗的时间更频繁。

通常,您可以通过仅在执行了先前计划的更新时才将新更新计划到UI来实现此目的。有关此操作的技术,请参见Throttling javafx gui updates

关于multithreading - JavaFX UI使用Platform.runLater()使用许多线程卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36623846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com