JavaFX线程总是可以运行的

时间:2014-11-13 13:35:23

标签: java swing javafx profiling

为什么JavaFX Application线程总是RUNNABLE?

来自YourKit探查器的以下屏幕(VisualVM显示类似图片):

enter image description here

黄色部分表示等待状态,浅绿色 - 可运行,当线程实际工作时表示深绿色(在堆栈跟踪中可见)

Swing的EDT等待事件并等待,但实际上JavaFX线程是什么呢?它的100%可运行状态是否会导致性能泄漏?

1 个答案:

答案 0 :(得分:3)

线程状态背景

根据Thread.State.RUNNABLE文档:

  

可运行线程的线程状态。处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,例如处理器。

大多数情况下,JavaFX应用程序线程正在等待操作系统级回调,因此即使它通常在等待,它也会在分析器中显示为RUNNABLE。这是因为等待是在本机代码中发生的,而不是在JVM中的睡眠样式调用。

从这个Java thread state UML diagram可以看出,Java线程需要不同的方法才能进入不同的状态。在Swing中,其中一个方法用于使EDT进入等待状态,但JavaFX中没有使用类似的方法。

JavaFX如何运作

architecture of the JavaFX system基于定时脉冲,默认情况下每秒会发射60次。为了获得没有图像撕裂的平滑动画显示,(我认为)系统可以启用vsync定时器,以便脉冲与显示器同步。标准JVM不了解特定于操作系统的vsync计时器,因此JavaFX系统使用本机代码使JavaFX应用程序线程在操作系统提供的vsync计时器上等待。

这不是问题

  

100%可运行状态是否会导致性能泄漏?

不,我不认为该州会导致性能泄漏。

需要注意的一点是,JavaFX应用程序线程适用于UI更新,因此在其上运行的事物默认情况下每秒最多只能运行60次。因此,如果您使用类似PauseTransition的东西并将暂停的持续时间设置为Duration.millis(10),则暂停实际上不会是10毫秒,而是60秒(约16毫秒)。

如果你的事情对时间非常敏感,你可能最好使用类似ScheduledThreadPoolExecutor或某些高分辨率OS原生计时器的东西,但对于大多数人来说,这不是他们需要的真正考虑因素。担心他们不会处理如此高分辨率的时间。

使用JavaFX应用程序线程时的主要性能考虑因素是确保完成所有工作并释放线程(最好在六十分之一秒内),以便不进行UI和事件处理你的应用程序,但这个考虑与Swing相同,所以没有什么新的。

脉冲定义

从JavaFX架构概述(帮助理解脉冲如何与事件处理相关):

  

当触发脉冲时,场景图上元素的状态将向下同步到渲染层。脉冲使应用程序开发人员能够以异步方式处理事件。这一重要功能允许系统批量处理脉冲上的事件。   。 。 。   Glass Windowing Toolkit负责执行脉冲事件。它使用高分辨率本机定时器来执行。

声明

关于这个答案的免责声明是,其中一些是我的推测,所以可能稍微不正确,但我认为这可能是事实的合理近似。

更多信息

如果您对调查更多内容感兴趣,可以查看open-jfx代码库中的TimerWinTimer代码或其他代码,或者在openjfx-dev上查询更多JavaFX架构问题JavaFX开发人员邮件列表。那里的开发人员比我更了解这些事情,并且能够做一些事情,例如验证我的猜测,例如脉冲是否是有效的。