【问题标题】:Is it possible to prioritize non-JavaFX threads over the JavaFX thread?是否可以将非 JavaFX 线程优先于 JavaFX 线程?
【发布时间】:2014-06-26 02:06:34
【问题描述】:

我有一个从硬件接收信息的 JavaFX 应用程序,使用:

Platform.runLater(new Runnable() {
    @Override
    public void run() {

    }
});

问题是,有时,如果不是总是,我想优先考虑数据收集的准确性。是否有可能暂时停止 JavaFX 线程的 runLater 替代方法?或者是否有可能有一个 JavaFX 线程是子线程的应用程序?

【问题讨论】:

  • 您多久致电一次runLater
  • 我有两个监听器,一个用于接收数据,一个用于 TextArea 中的更改(作为接收数据的结果)。两者都调用 runLater。
  • TextArea 侦听器无关紧要,因为用户无法快速键入以生成大量 runLater 调用。您多久收到一次数据?我要解决的是为什么您认为 setting thread priority 会对您的情况产生任何理想的影响?
  • 串行数据,波特率为 115200。
  • 太疯狂了 ;-) JavaFX 脉冲默认限制为每秒 60 个,因此无需每秒调用 runLater 超过 60 次,否则您将不必要地淹没 JavaFX 事件调度程序导致在可怕的表现。无论如何,看起来您的解决方案是将输入数据批量化,然后定期将数据批量分流到 JavaFX 线程以通过 runLater() 进行处理。

标签: java multithreading user-interface javafx thread-priority


【解决方案1】:

暂停 JavaFX 线程,将导致 UI 冻结!

希望你不是在找它!

如果您想优先处理数据收集部分,只需在不同的 Worker 线程 (Task) 上运行它,它将与 JavaFX 线程并行运行,并且一旦数据收集完成,使用 runLater 将其更新回 UI!

【讨论】:

  • 当您说“冻结 UI”时,是永久还是暂时?因为应用程序暂时无响应也是我的解决方案的一个选项。
  • 只要 JavaFX 线程处于暂停状态,UI 就会保持无响应。由于您无法绝对确定收集数据需要多长时间,这将导致糟糕的用户体验。您必须认真研究TaskConcurrency,因为我不推荐您的方法。
  • 谢谢,我一定会调查的。
  • 我最终在计时器中使用runLater 来定期追加数据,从而减少调用次数。我一定忘记了我自己的代码在做什么,因为数据收集似乎是在与 JavaFX 应用程序线程不同的线程上(我认为否则它不会起作用),它只是为每个数据输入事件附加,调用 runLater 的方式比最优方式更频繁。所以 +1 表示“数据收集完成后”。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2020-04-30
  • 2023-03-12
相关资源
最近更新 更多