请求 JavaFX 线程在不使用 Platform.runLater 的情况下调用一些代码

Requesting the JavaFX thread to call some code without using Platform.runLater

在我正在制作的应用程序中,我希望所有事情都在一个线程上完成。我想介绍一些异步的网络 IO。我想我会把它放在一个线程上以减少并发症,只使用 Channel/Selector.

有没有办法让 JavaFX 主线程定期(或在其逻辑结束时)调用代码块。在这种情况下,我希望它经常执行此操作,以始终使应用程序保持最新状态。

我已经尝试搜索如何执行此操作,但没有成功。

如果我要用它制作一些 ASCII 艺术作品:

|                    Is there a gap here I can run the code in?
|                                V
|[JavaFX thread]--------------o     --------------o       --------------o
|                             ^
|                     Here all the UI work is done and it pauses before starting again

我不知道这是否真的是 JavaFX 线程的工作方式。在完成所有图形更新和逻辑之后,我在某个地方进行了计算,它休息一下并调用任何由 Platform.runLater 执行的 Runnable。这里的问题是我不想一直用新的 Runnable 向它发送垃圾邮件,我猜这是不好的做法?

理想情况下,我希望拥有它,以便主 JavaFX 线程执行其所有逻辑,然后轮询来自网络连接的任何输入。这应该 运行 即使用户什么都不做(这意味着我不能依赖用户输入事件来触发套接字读取)。

有办法吗?

注意:从套接字接收的数据将与 JavaFX 模块中的内容交互,因此更有理由将其保留在主 JavaFX 线程中。

您可以这样做,但请注意,当处理时间过长时,它可能会阻止您的 UI。你可以滥用 Timeline or PauseTransition for that, or you can use a convenient wrapper from ReactFX.

暂停过渡

PauseTransition pt = new PauseTransition(Duration.millis(500));
pt.setOnFinished(ae -> {
    // do your work here, it runs on the JavaFX application thread
});
SequentialTransition seq = new SequentialTransition(pt);
seq.setCycleCount(Animation.INDEFINITE);
seq.play();

时间线

Timeline timeline = new Timeline(new KeyFrame(
        Duration.millis(500),
        ae -> {
            // do your work here, it runs on the JavaFX application thread
        }));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();

ReactFX

FxTimer.runPeriodically(
        Duration.ofMillis(500),
        () -> {
            // do your work here, it runs on the JavaFX application thread
        });

查看 AnimationTimer class。它完全符合您的要求。