请求 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。它完全符合您的要求。
在我正在制作的应用程序中,我希望所有事情都在一个线程上完成。我想介绍一些异步的网络 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。它完全符合您的要求。