2017-12-15 1 views
0

Java 8이 올바르게 설치되었으며 Java 버전은 OpenJDK가 아닙니다. 내 IDE는 Eclipse입니다. 나는 mediaPlayer는 몇 초 동안 음악을 재생할 수 있습니다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(); 
    } 
} 

자바 FX 프로젝트에서 다음 코드를 실행하면 다음 소리없이 예외가 발생하지 않습니다.

은 그 때 나는

private static Media song; 

private Media song; 

에서 8 호선을 변경 및 수정 된 코드는 성공적으로 실행.

문제가 해결되었지만 이유를 알고 싶습니다. 이 2 개 다음 스크린 샷은 수정하기 전에 이클립스

의 디버그 모드에서 촬영 : enter image description here

수정 후 : after modification

의 차이는 "JFXMedia 플레이어 EventQueueThread"입니다.

+0

'static '을 추가하는 것이 올바른 수정이 아닐 수 있습니다. 스택 추적이 충돌 할 때 게시 할 수 있습니까? –

+0

정적을 추가 할 때 인스턴스를 만들었습니까? –

+1

'static '을 추가하여 만든 차이점은'Media' 인스턴스가 범위를 벗어나는 것을 방지한다는 것입니다. 실제로 미디어를 재생하는 스레드는 약한 참조 만 유지합니다. 실제 응용 프로그램에서는 이것이 분명히 문제가되지 않습니다. –

답변

0

미디어 플레이어 스레드 - JFXMedia Player EventQueueThread의 가비지 수집 문제가 표시됩니다. Iv'e는 스레드와 GC를 모니터하기 위해 VisualVM을 사용했습니다.

코드는 MediaPlayer을 시작하고 반환하여 인스턴스 참조가 GC에 적합하도록 남겨 둡니다. 여기에는 GC를 강제 (6시 44분 57초에서) 출시 후 몇 초 :

enter image description here

JFXMedia Player EventQueueThread이 정지 동시에 :

enter image description here

함으로써 Media 또는 MediaPlayerstatic 클래스 인스턴스 대신 클래스 로더에 묶어두기 때문에 컬렉션에 적합하지 않습니다. 일반적으로 JavaFX 클래스를 사용할 때는 Application을 서브 클래스 화해야합니다. 클래스의 JavaDoc의 상태 :

자바 FX 애니메이션 타임 라인을 응용 프로그램이 방법, 처리 입력 이벤트를 시작 실행, 실행을위한 응용 프로그램 스레드를 생성 스레딩

.

Java 실행기는 지정된 Application 클래스를 JavaFX 응용 프로그램 스레드에서로드하고 초기화합니다. 응용 프로그램 클래스 에 주 방법이 없거나 주 메서드가 Application.launch()를 호출하면 JavaFX 응용 프로그램 스레드에서 응용 프로그램의 인스턴스가 으로 생성됩니다.

이렇게 코드를 실행하면 GC에서 JFXMedia Player EventQueueThread을 수집 할 수 없습니다.다시 말하지만, 나는

enter image description here

(7시 19분 4초에서)는 GC를 시작하고 현재 스레드가 아직 살아 다음 main 스레드와 함께이 또한 것을

enter image description here

공지 사항 JavaFX-Launcher. 당신이 힙 덤프를 검사해야 진정한 깊은 분석을 위해

,하지만 희망이 통찰력이 질문의 범위에 대한 충분하다.

관련 문제