gpt4 book ai didi

java - JLayer 暂停和恢复

转载 作者:行者123 更新时间:2023-12-01 04:32:54 25 4
gpt4 key购买 nike

我刚刚开始使用 Jlayer 库来播放 MP3。它工作得很好,我可以播放这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让播放 MP3 的线程等待,声音会停止,为了恢复歌曲,我只需要通知线程即可。这是我得到的:

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() 不执行任何操作,程序甚至没有到达 notification()。为什么会出现这种情况?

我已经阅读了之前关于此问题的问题,但我无法使它们发挥作用。我也有兴趣了解为什么这段代码不起作用,以便我可以进一步了解多线程。谢谢!

最佳答案

现在已经很晚了,如果我读错了您的代码,请原谅我。但据我所知,您以 continuePlaying = true; 启动线程,并且 run 方法仅调用 play(); 没有初始化新播放器,然后直接进入一个必须退出点的 while (true) 循环。 continuePlaying 不能被仍然陷入无限循环的线程更改,即使您启动另一个 MP3 线程来访问 volatile 变量,它也会在能够更改任何内容之前进入相同的循环。因此 wait() 永远不会到达。稍后,您尝试从其内部通知()您的等待线程。这有点悖论,因为它正在等待被通知,并且处于等待状态,什么也不做,更不用说通知自己了。在收到通知之前它根本无法做任何事情,包括通知自己或其他人。我想说的是,您应该处理 wait(),尤其是来自正在处理/等待的线程外部的 notification()。

此外,您的 player.play(); 处于奇怪的位置。目前,播放器只能在线程暂停(等待)至少一次后才开始播放,因为它位于 while(!continuePlaying) 条件之后。

因此,对于您的情况,我会选择使用不同线程(甚至是测试的主线程)中的方法,这些方法调用 wait() 和 notification() 并在相关线程上同步。

关于java - JLayer 暂停和恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756516/

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