首页 文章

使用Platform.runLater()使用多个线程冻结JavaFX UI

提问于
浏览
0

我有一个JavaFX应用程序,它运行多个执行繁重计算的线程 . 问题是,一段时间后UI完全冻结,但我只用Platform.runLater()更新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 );
}

现在线程做很多东西,比如下载文件,但我想这不应该影响UI . 他们偶尔会从界面上读取,但这应该不是问题 .

我认为通过使用platform.runlater(),UI无法冻结 .

Platform.runLater(() -> {
     mainController.getIndexController().writeToConsole(result);
 });

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

2 回答

  • 2

    从你的问题中可以肯定地知道,但听起来好像你只是通过多次调用 Platform.runLater(...) 来安排到FX应用程序线程的许多可运行程序 . "How many is too many"不负责任,因为它取决于很多因素,但通常你不应该更频繁地安排它们而不是消费它们 .

    通常,您可以通过仅在执行了先前的计划更新时安排对UI的新更新来执行此操作 . 有关执行此操作的技巧,请参阅Throttling javafx gui updates .

  • 0

    事实上,你说UI完全冻结声音对我来说更像死锁条件而不是使用太多的Platform.runLater调用 . 有各种工具可用于检测死锁 . 使用太多的Platform.runLater调用通常只会使系统变慢,因为存在一个 Build 的调用队列 .

相关问题