2012-12-21 6 views
0

Je travaille sur un programme qui lit de la musique en arrière-plan via le multithreading, car l'interface graphique gèle autrement. J'ai une connaissance de base du multithreading (volatile, synchronisation, etc.) mais je me demandais comment arrêter/suspendre immédiatement un thread (même lorsque les processus sont en cours de traitement). J'ai la musique en boucle en arrière-plan mais si j'accrocher une variable d'arrêt jusqu'à la boucle, la chanson doit cesser de jouer pour que la musique s'arrête. Donc, ma question demeure, à partir du fil parent est-il un moyen de mettre immédiatement en pause ou terminer la musique au milieu de la chanson, parce que j'ai l'audio à jouer après.Mettre en pause la musique dans JFugue

+0

Voulez-vous mettre la musique en pause ou mettre un fil en pause? (Astuce: vous voulez mettre en pause la musique, pas le fil.Le fil peut contenir un verrouillage critique.) –

+0

@DavidSchwartz Alors oui, je veux mettre en pause la musique, je vais changer le titre. – EpicDavi

Répondre

1

D'abord, la plupart des boucles dans un fil devrait ressembler à ceci:

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

S'il y a blocage des appels à l'intérieur de la boucle (qu'elle sonne comme de votre description), ils permettent probablement d'interruption(). Un appel à l'interruption() de l'extérieur du thread va casser l'appel de blocage et vous vider dans le bloc catch. Cela finit par effacer le drapeau "interruption", donc vous devez appeler à nouveau l'interruption pour sortir de la boucle.

Selon la façon dont vous écoutez de la musique:

  • Si vous utilisez une bibliothèque qui a une méthode « pause » ou « stop » pour jouer la musique, vous pouvez simplement utiliser. On dirait que vous utilisez jFugue - son lecteur a une méthode pause() - avez-vous essayé d'appeler ça?
  • Si vous faites quelque chose d'autre, vous devez garder une trace de la position de la chanson et appeler l'interruption() sur le fil. Si vous voulez redémarrer, vous devez demander à la position suivie

Notez que si vous voulez redémarrer avec la boucle au-dessus, vous aurez besoin d'une boucle imbriquée comme:

while(true) { 
    while(!isInterrupted()) { 
     ... 
    } 
} 

Si vous avez seulement la boucle! IsInterrupted(), le thread se terminera et ne pourra pas être redémarré.

Espérons que cela aide!

+0

Note: Je viens de remarquer que le sujet mentionne jFugue. J'ai regardé les docs et sa classe Player a une méthode pause(). Avez-vous essayé cela? –

Questions connexes