gpt4 book ai didi

java - 为什么 JavaFX 媒体播放器崩溃?

转载 作者:行者123 更新时间:2023-11-30 06:22:33 25 4
gpt4 key购买 nike

我已经正确安装了 Java 8,并且它是 oracle 版本(不是 OpenJDK)。我的IDE是Eclipse。当我在 JavaFX 项目中运行以下代码时,

import java.io.File;
import javafx.embed.swing.JFXPanel;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

public class TestPlayer {
static JFXPanel fxPanel =new JFXPanel();
private Media song;
private MediaPlayer mediaPlayer ;
public TestPlayer(String filePath) {
song=new Media(new File(filePath).toURI().toString());
mediaPlayer = new MediaPlayer(song);
}

public void play() {
this.mediaPlayer.play();
}
public static void main(String[] args) {
new TestPlayer("song\\1.mp3").play();
}
}

mediaPlayer 只能播放歌曲几秒钟,然后没有声音,也不会抛出异常。

然后我将第 8 行更改为

private Media song;

private static Media song;

修改后的代码运行成功。

虽然问题解决了,但我想知道原因。以下两张截图是在Eclipse的 Debug模式下截取的

修改前: enter image description here

修改后: after modification

区别在于“JFXMedia Player EventQueueThread”。

最佳答案

您发现媒体播放器线程 - JFXMedia Player EventQueueThread 存在垃圾收集问题。我用过VisualVM监控线程和GC。

您的代码启动 MediaPlayer 并返回,使实例引用符合 GC 条件。在这里,我在启动后几秒钟(6:44:57)强制执行 GC:

enter image description here

同时 JFXMedia Player EventQueueThread 停止:

enter image description here

通过使 MediaMediaPlayer static 您将它们绑定(bind)到类加载器而不是类实例,因此它们不是符合 Collection 条件。通常,在使用 JavaFX 类时,您应该对 Application 进行子类化。该类的 JavaDoc 指出:

Threading

JavaFX creates an application thread for running the application start method, processing input events, and running animation timelines.

The Java launcher loads and initializes the specified Application class on the JavaFX Application Thread. If there is no main method in the Application class, or if the main method calls Application.launch(), then an instance of the Application is then constructed on the JavaFX Application Thread.

以这种方式运行代码时,GC 无法收集 JFXMedia Player EventQueueThread。我再次发起了 GC(在 7:19:04)

enter image description here

现在线程仍然存在:

enter image description here

请注意,main 线程也与 JavaFX-Launcher 一起存在。

要进行真正的深入分析,您必须检查堆转储,但希望这种见解足以解决问题的范围。

关于java - 为什么 JavaFX 媒体播放器崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47835433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com