为什么 Platform.runLater 不检查它当前是否在 JavaFX 线程上?

2022-09-02 03:38:30

使用 JavaFX 8 时,我们需要通过 运行与 GUI 的交互,否则如果从另一个线程运行,它们将引发异常。Platform.runLater

但是,从不检查它当前是否在 JavaFX 线程上。Platform.runLater

我写了以下方法:

public static void runSafe(final Runnable runnable) {
    Objects.requireNonNull(runnable, "runnable");
    if (Platform.isFxApplicationThread()) {
        runnable.run();
    }
    else {
        Platform.runLater(runnable);
    }
}

这可确保它永远不能在非 fx 应用程序线程上运行。

有什么理由默认实现不做这种短路吗?


答案 1

runLater基本上将Runnable放在FX线程可用时执行的队列中。可以通过非 FX 线程访问该方法。想象一下,其他一些线程已将任务放入队列中,然后再次调用(无论是否来自 FX 线程)都应将新任务放在该队列的末尾。runLaterrunLater

通过短路,您提出的先前任务基本上具有较低的优先级,这可能是不希望的。


答案 2

当调用一个函数时,该函数被称为“runLater”,我希望它稍后运行,而不是现在。

在我看来,实现正在做正确的事情,基于它的名称和文档

在将来某个未指定的时间在 JavaFX 应用程序线程上运行指定的 Runnable。

此方法(可以从任何线程调用)会将 Runnable 发布到事件队列,然后立即返回给调用方。Runnables按其过帐顺序执行。传递给 runLater 方法的 runnable 将在任何 Runnable 传递到对 runLater 的后续调用之前执行

如果不希望代码稍后运行,请不要要求稍后运行。这就是你对代码所做的。


推荐