Java JLayer暂停并恢复
我刚开始使用Jlayer库来播放MP3。它工作得很好,我能演奏这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让我播放MP3的线程等待,声音就会停止,为了恢复歌曲,我只需通知线程。以下是我得到的:Java JLayer暂停并恢复,java,multithreading,audio,mp3,jlayer,Java,Multithreading,Audio,Mp3,Jlayer,我刚开始使用Jlayer库来播放MP3。它工作得很好,我能演奏这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让我播放MP3的线程等待,声音就会停止,为了恢复歌曲,我只需通知线程。以下是我得到的: import java.util.Scanner; import java.io.BufferedInputStream; import java.io.FileInputStream; import javazoom.jl.player.Player; public
import java.util.Scanner;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import javazoom.jl.player.Player;
public class MP3 extends Thread{
private String filename;
private Player player;
private Thread t;
private volatile boolean continuePlaying = true;
// constructor that takes the name of an MP3 file
public MP3(String filename) {
this.filename = filename;
}
public void close() { if (player != null) player.close(); }
// play the MP3 file to the sound card
public void play() {
try {
FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis);
player = new Player(bis);
}
catch (Exception e) {
System.out.println("Problem playing file " + filename);
System.out.println(e);
}
}
public void run() {
play();
try {
while (true) {
synchronized(this) {
while(!continuePlaying)
wait();
player.play();
}
}
}
catch (Exception e) {
System.out.println(e);
}
}
private void pause() throws InterruptedException{
System.out.println("Pause");
continuePlaying = false;
}
private void resumeSong() throws InterruptedException{
synchronized(this) {
System.out.println("Resume");
continuePlaying = true;
notify();
}
}
// test client
public static void main(String[] args) throws InterruptedException{
String filename = ("Fall To Pieces.mp3");
MP3 mp3 = new MP3(filename);
mp3.start();
Scanner s = new Scanner(System.in);
s.nextLine();
mp3.pause();
s.nextLine();
mp3.resumeSong();
try {
mp3.join();
} catch (Exception e){
}
}
}
然而,出于某种原因,wait不起任何作用,程序甚至无法到达notify。为什么会这样
我已经阅读了前面关于这方面的问题,但我还没能让它们起作用。我还对学习为什么这段代码不起作用感兴趣,以便进一步理解多线程。谢谢大家! 这里很晚了,请原谅我看错了你的密码。但在我看来,你的线程从continueplay=true开始;run方法只调用play;没有初始化新玩家,然后直接进入一个真正的循环,它必须退出点。持续播放不能被仍然卡在无限循环中的线程更改,即使您启动另一个MP3线程访问volatile变量,它也会在能够更改任何内容之前进入相同的循环。因此,等待永远不会到来。 稍后,您将尝试从其内部通知等待的线程。这有点自相矛盾,因为它在等待被通知,处于等待什么都不做的状态,更不用说通知自己了。在通知之前,它不能做任何事情,包括通知自己或其他人。我想说的是,您应该处理wait,但特别是从正在寻址/等待的线程外部通知 另外你的player.play;他的处境很奇怪。此时,玩家只应在线程暂停后开始播放。至少等待一次,因为线程已延迟!连续铺设条件
因此,对于您的情况,我会使用不同线程中的方法,甚至是测试的主线程中的方法,这些方法调用wait和notify on,并通过相关线程进行同步。哦,我明白了。这是我第一次使用线程,所以我想你是对的。然而,我的问题是如何在不使用while循环的情况下使线程保持活动状态?另外,如果我无法更改布尔值,如何临时挂起线程?@amb110395为什么要根据线程中的变量挂起线程?有什么反对打mp3的吗;而不是mp3.pause和notify保持同步?此外,你不需要一个永久的循环来保持你的线程的活力。像任何其他对象一样,只要它有一个活动引用,它就应该是好的,这个引用就是变量mp3。是的,我做了一些类似的事情,它就工作了。无论如何,谢谢您解决方案就在这里: