Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX线程始终可运行_Java_Swing_Javafx_Profiling - Fatal编程技术网

JavaFX线程始终可运行

JavaFX线程始终可运行,java,swing,javafx,profiling,Java,Swing,Javafx,Profiling,为什么JavaFX应用程序线程总是可以运行 YourKit profiler的以下屏幕(VisualVM显示了类似的图片): 黄色部分表示线程实际工作时的等待状态、浅绿色-可运行状态和深绿色(在stacktrace中可见) Swing的EDT会等待事件,否则会等待,但JavaFX到底在幕后执行什么任务呢?其100%可运行状态是否会导致性能泄漏?线程状态背景 根据文件: 可运行线程的线程状态。处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统的其他资源,如处理器 大多数时

为什么JavaFX应用程序线程总是可以运行

YourKit profiler的以下屏幕(VisualVM显示了类似的图片):

黄色部分表示线程实际工作时的等待状态、浅绿色-可运行状态和深绿色(在stacktrace中可见)

Swing的EDT会等待事件,否则会等待,但JavaFX到底在幕后执行什么任务呢?其100%可运行状态是否会导致性能泄漏?

线程状态背景

根据文件:

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

大多数时候,JavaFX应用程序线程都在等待操作系统级回调,因此它在探查器中显示为可运行,即使它通常在等待。这是因为等待发生在本机代码中,而不是JVM中的睡眠式调用

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

JavaFX的工作原理

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

这不是问题

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

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

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

如果你有非常细粒度的时间敏感的东西,你可能会更好地使用一个或一些高分辨率的操作系统本机计时器,但对大多数人来说,这不是他们需要担心的真正的考虑,因为他们不会处理这样的高分辨率计时

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

脉冲定义

从JavaFX体系结构概述(帮助理解脉冲与事件处理的关系):

触发脉冲后,场景图上元素的状态将同步到渲染层。pulse使应用程序开发人员能够异步处理事件。此重要功能允许系统在脉冲上批处理和执行事件。 . . . 玻璃窗工具箱负责执行脉冲事件。它使用高分辨率本机计时器执行

免责声明

关于这个答案的免责声明是,其中一些是我的猜测,因此可能有点不正确,但我认为这可能是对事实的合理近似

进一步资料


如果您对更多的研究感兴趣,您可以查看开放jfx代码库中的and代码或其他代码,或者在JavaFX开发人员邮件列表中进一步询问JavaFX体系结构问题。那里的开发人员比我更了解这些事情,能够验证我的猜测,比如脉冲是否同步。

感谢您的详细回复!