Multithreading 通过Platform.runLater()使用多线程冻结JavaFXUI

Multithreading 通过Platform.runLater()使用多线程冻结JavaFXUI,multithreading,javafx,Multithreading,Javafx,我有一个JavaFX应用程序,它运行多个线程,执行繁重的计算。问题是,过了一段时间,UI完全冻结,但我只使用Platform.runLater()更新UI 我启动生成其余线程的主线程的方式: mainThread = new MainThread(mc); mainThread.start(); 在这里,我给线程提供了对主控制器的引用,主控制器将此引用传递给其余线程,以便它们可以将内容打印到文本区域 主线程一次只生成2个子线程,但这两个子线程使用具有可配置线程数(100+)的ExecutorS

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

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

mainThread = new MainThread(mc);
mainThread.start();
在这里,我给线程提供了对主控制器的引用,主控制器将此引用传递给其余线程,以便它们可以将内容打印到文本区域

主线程一次只生成2个子线程,但这两个子线程使用具有可配置线程数(100+)的ExecutorService:

因为我没有任何其他代码修改UI,所以这一定是问题所在。该程序执行许多平台。runLater()-s,是否太多?
或者多少才算太多?还有一些具有平滑UI的应用程序比我的应用程序更频繁地更新界面,并且运行良好。有什么问题吗?谢谢。

从您的问题中无法确定,但听起来好像您只是通过调用
Platform.runLater(…)
太多次,将许多可运行程序安排到FX应用程序线程。“多少就是太多”是不可回答的,因为这取决于许多因素,但一般来说,你不应该安排的频率超过它们的消费量


通常情况下,您可以通过仅在已计划的上一个更新已执行时计划对UI的新更新来完成此操作。请参阅以了解执行此操作的技巧。

您说UI完全冻结的事实听起来更像是死锁状态,而不是使用太多的Platform.runLater调用。有多种工具可用于检测死锁。使用太多的Platform.runLater调用通常只会使系统变慢,因为调用队列正在增加。

一些单独的更新不会执行,这是正确的。但是,由于您的更新正在更新UI,因此您不希望更新它们的频率高于渲染帧的频率。也就是说,如果在将文本设置为
“X”
和将文本设置为
“Z”
之间没有显示任何帧,则用户将永远看不到中间更新。
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(() -> {
     mainController.getIndexController().writeToConsole(result);
 });