Windows上的JavaFX GUI线程和锁定屏幕

Windows上的JavaFX GUI线程和锁定屏幕,java,multithreading,javafx,Java,Multithreading,Javafx,我有一个JavaFx应用程序,它在后台线程上从API读取数据(或者在应用程序启动时从本地存储中预加载测试数据),然后它处理数据并将数据设置到模型中,该模型直接绑定到我视图中的属性上。由于处理数据并将其设置为模型会更改组件中显示的文本,因此使用Platform.runLater()调用它。通常,当调用它时,它会消耗大约2%的CPU,但如果我运行应用程序的时间更长,数据处理上的CPU消耗会更高一些(可能数据处理对GUI线程来说太多了)。例如,它在1小时内获得大约+4%的收益 然而,我所看到的奇怪行为

我有一个JavaFx应用程序,它在后台线程上从API读取数据(或者在应用程序启动时从本地存储中预加载测试数据),然后它处理数据并将数据设置到模型中,该模型直接绑定到我视图中的属性上。由于处理数据并将其设置为模型会更改组件中显示的文本,因此使用
Platform.runLater()
调用它。通常,当调用它时,它会消耗大约2%的CPU,但如果我运行应用程序的时间更长,数据处理上的CPU消耗会更高一些(可能数据处理对GUI线程来说太多了)。例如,它在1小时内获得大约+4%的收益

然而,我所看到的奇怪行为是,当我锁上窗口,离开几分钟,然后回来时,数据处理的CPU使用率从8%变为17%,例如,然后保持那么高。这是否意味着当Windows屏幕被锁定时GUI线程不运行?在我看来似乎不是这样,当它解锁时,GUI线程会被
Platform.runLater()
调用淹没。但当它不处理数据时,它会消耗0%的CPU,所以我真的很困惑

有人知道这是什么原因吗?当窗口被锁定时,GUI线程真的停止工作了吗

编辑:

我已经发现处理接收到的数据对于UI线程来说可能是一项过于繁重的任务,我正在尝试对其进行优化(在后台线程上进行大部分处理,然后使用
Platform.runLater
调用设置数据)。 目前,后台下载的代码非常简单,如下所示:

    Thread updateDaemon = new Thread(() -> {
      try {
        while (true) {
          TimeUnit.SECONDS.sleep(5);
            processMarketStateData(view.getTable(), data);
          }
        }
      }
      catch (InterruptedException e) {
        logger.error("Background worker interrupted", e);
      }
    });
    updateDaemon.setDaemon(true);
    updateDaemon.start();
processMarketStateData
中,我进行了一些处理,然后将数据设置为UI线程上的模型。但我真正好奇的是,奇怪的CPU使用行为。当更新线程处于休眠状态且我不与UI交互时,CPU使用率为0%。当
processMarketStateData
占用了很少的CPU,然后又是0%till update thread结束睡眠。但由于一些奇怪的原因,在几次
processMarketStateData
调用后,CPU使用率越来越高。我的CPU使用率上升了一个小百分比,比如50次调用后增加了1%,可能更多。更奇怪的是,当windows屏幕被锁定时,产生这种奇怪行为所需的调用更少。当它变得非常疯狂时调用它已经占用了大约20%的CPU,只有在
processMarketStateData
调用时它才会达到如此高的值,其余时间它是0%。经过很长时间(几个小时)的测试,我最终处于应用程序永久占用25%的CPU,UI处于响应状态。请注意,有两个线程同时运行

我真正的问题不是“为什么我的ui在处理数据时会滞后”,这并不难找到,而是“为什么它会这样做?” 我希望这次编辑能让我的问题变得更好


EDIT2:另一个奇怪的行为是,如果我让应用程序最小化一段时间并自动更新,然后打开它,它会有一段时间是黑色窗口,但没有自动更新的应用程序是可以的。这真的让我觉得当应用程序最小化或windows屏幕被锁定时JavaFXUI线程不会运行。很遗憾我找不到太多关于此的信息。

这些链接可能会对您有所帮助

这可能是您正在UI线程中执行cpu密集型任务。请提供一些代码示例


您可以使用服务类进行cpu密集型计算,然后在platform.runlater调用中更新ui。

似乎我已经找到了真正的问题并解决了它。不幸的是,除非我共享整个项目,否则您将无法帮助我。问题是有一个从
processMarketStateData 方法,该方法根据接收到的数据设置样式。问题是它调用了
node.getStyleClass().add(style)
,但没有检查样式的存在。因此,15分钟后
node.getStyleClass()的大小
大约为300。添加该检查后,似乎一切运行正常,最多占用2%的CPU。

嗨,谢谢你的回答。事实上我知道所有这些(至少我认为我知道)。我想我表达错了。请参阅我的编辑:)