2012-12-21 2 views
0

GUI가 다르게 정지하기 때문에 멀티 스레딩을 통해 백그라운드에서 음악을 재생하는 프로그램을 작업 중입니다. 나는 멀티 쓰레딩 (휘발성, 동기화 등)에 대한 기본적인 지식을 갖고 있지만 스레드를 즉시 멈추거나 일시 중지하는 방법 (프로세스가 처리중인 경우에도)을 궁금해하고 있습니다. 나는 백그라운드에서 음악을 반복하고 있지만, 정지 변수를 루프에 연결하면 음악이 멈추도록 재생이 멈춰야합니다. 그래서 내 질문은 부모 스레드에서 즉시 노래를 중간에 음악을 일시 중지하거나 종료 할 수있는 방법이있다. 왜냐하면 내가 그 후에 재생할 오디오를 가지고 있기 때문이다.JFugue에서 음악 일시 중지

+0

음악을 일시 중지 하시겠습니까, 아니면 일시 중지 하시겠습니까? (힌트 : 스레드가 아닌 음악을 일시 중지하고 싶을 때 스레드가 치명적인 잠금 장치를 가지고있을 수 있습니다.) –

+0

@DavidSchwartz 그렇다면 예, 음악을 일시 중지하고 제목을 변경합니다. – EpicDavi

답변

1

먼저, 스레드에있는 대부분의 루프이 유사하게 나타납니다

while(!isInterrupted()) { 
    try { 
     // do something (like play song) 
    } catch (InterruptedException e) { 
     interrupt(); 
    } 
} 

(그것이 당신의 설명에서 같은 소리) 루프 내부에 차단 호출이있는 경우, 그들은 가능성이 수 인터럽트를(). 스레드 외부에서 interrupt()를 호출하면 차단 호출이 중단되고 catch 블록으로 이동됩니다. 이렇게하면 "인터럽트"플래그가 지워지므로 루프를 빠져 나오기 위해 다시 인터럽트를 호출해야합니다.

어떻게 당신이 연주하는 음악에 따라 : 당신이 음악을 재생 "중지"메소드를 "일시 중지"가 라이브러리를 사용하거나하는 경우

  • , 당신은 그냥 사용할 수 있습니다. jFugue를 사용하는 것 같습니다. 플레이어의 pause() 메소드가 있습니다. 호출 해 보았습니까?
  • 다른 작업을 수행하는 경우 노래의 위치를 ​​추적하고 스레드에서 interrupt()를 호출해야합니다.

    while(true) { 
        while(!isInterrupted()) { 
         ... 
        } 
    } 
    
    : 다시 시작하려는 경우, 당신은 당신이 위의 루프로 다시 시작하려는 경우, 당신은 같은 중첩 루프를해야한다는

참고 다시 추적 된 위치로 추구해야합니다

! isInterrupted() 루프 만있는 경우 스레드가 완료되고 다시 시작할 수 없습니다.

희망이 도움이됩니다.

+0

참고 : 주제가 jFugue에 대해 언급 한 것을 보았습니다. 나는 문서를 보았고 Player 클래스에는 pause() 메소드가있다. 너 그거 해봤 니? –

관련 문제