以延迟结束的Java线程
我正在尝试在java应用程序中播放mp3。用户可以单击按钮并更改声音 声音和切换工作…但是当用户尝试切换声音时,新歌开始在旧歌上播放约一秒钟,然后旧歌停止播放。我正在尝试使用线程来处理一切 我的MP3课程:以延迟结束的Java线程,java,eclipse,multithreading,javasound,Java,Eclipse,Multithreading,Javasound,我正在尝试在java应用程序中播放mp3。用户可以单击按钮并更改声音 声音和切换工作…但是当用户尝试切换声音时,新歌开始在旧歌上播放约一秒钟,然后旧歌停止播放。我正在尝试使用线程来处理一切 我的MP3课程: import java.applet.*; import javazoom.jl.player.Player; import java.io.*; import java.io.FileInputStream; import java.net.*; public class mp3 ext
import java.applet.*;
import javazoom.jl.player.Player;
import java.io.*;
import java.io.FileInputStream;
import java.net.*;
public class mp3 extends Thread implements Runnable{
private Player sound;
private InputStream path;
public mp3(String file_name) {
path = mp3.class.getClassLoader().getResourceAsStream(file_name);
}
public void run(){
try {
Player sound=new Player(path);
sound.play();
} catch(Exception e) {System.out.println(e);}
}
}
这就是我在主游戏中运行代码的方式。MP3对象称为歌曲
应用程序初始化时,将运行以下代码:
song = new mp3("default.mp3");
song.start();
song.stop();
song = new mp3(t+".mp3");
song.start();
如果有人试图更改,将运行以下代码:
song = new mp3("default.mp3");
song.start();
song.stop();
song = new mp3(t+".mp3");
song.start();
其中t是文件名的参数
我很确定问题在于MP3对象的run函数。我对穿线一无所知,所以我希望能得到一些帮助
同样,延迟大约是从调用“停止”到它实际停止播放的时间的1秒。那么也许在那里的某个地方等一下
谢谢
编辑:我正在使用基于以下内容的代码:
我创建了一个play and close函数,定义如下:
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);
}
// run in new thread to play in background
new Thread() {
public void run() {
try { player.play(); }
catch (Exception e) { System.out.println(e); }
}
}.start();
我的问题是关闭函数…播放器对象总是空的,关闭函数不执行…即使播放函数初始化它。为什么为空?编辑:
在编辑中,如果多个线程正在访问播放器
字段,则应将其设置为易失性
。如果看不到player
是如何定义的,那么很难猜测问题的其他方面
我认为在开始下一个mp3之前,您需要确保
播放器
已完成上一个mp3。看这张照片,我看到:
引述:
如果所有可用的MPEG音频帧都已解码,则返回true,否则返回false
如果要在新声音开始时停止上一个音频,应在旧播放器上使用close()
关闭此播放器。当前播放的任何音频都会立即停止
我觉得您需要关闭当前运行的Player
对象(如果有),然后启动一个新的Player
对象来播放新声音。如果要在多个线程中执行此操作,则需要执行以下操作:
最终对象锁定对象
播放器
对象(如果有)是否已通过睡眠
close()
当前的Player
对象,并创建一个新的Player
,如果您想消除当前的声音play()
下一个mp3play()
方法并不等待声音播放,而是在将声音加载到音频缓冲区后立即返回。但我不确定如果音频文件很大会发生什么。编辑:
在编辑中,如果多个线程正在访问播放器
字段,则应将其设置为易失性
。如果看不到player
是如何定义的,那么很难猜测问题的其他方面
我认为在开始下一个mp3之前,您需要确保
播放器
已完成上一个mp3。看这张照片,我看到:
引述:
如果所有可用的MPEG音频帧都已解码,则返回true,否则返回false
如果要在新声音开始时停止上一个音频,应在旧播放器上使用close()
关闭此播放器。当前播放的任何音频都会立即停止
我觉得您需要关闭当前运行的Player
对象(如果有),然后启动一个新的Player
对象来播放新声音。如果要在多个线程中执行此操作,则需要执行以下操作:
最终对象锁定对象
播放器
对象(如果有)是否已通过睡眠
close()
当前的Player
对象,并创建一个新的Player
,如果您想消除当前的声音play()
下一个mp3据我所知,
play()
方法并不等待声音播放,而是在将声音加载到音频缓冲区后立即返回。但是,我不确定如果音频文件很大会发生什么。Thread.stop()
是一种不推荐使用的方法,不应使用。您可能会更幸运地使用或。扩展线程或实现Runnable。没有必要两者都做。关闭线程很可能不是立即停止声音的正确方法。Javazoom的播放器应该提供一些方法。如果没有,那就是他们的目标的缺陷。另外,播放器的每个实例可能都应该在自己的线程中,而不是试图重用。如果由多个线程访问,则需要将player
设置为volatile
。Thread.stop()
是一种不推荐使用的方法,不应使用。您可能会更幸运地使用或。扩展线程或实现Runnable。没有必要两者都做。关闭线程很可能不是立即停止声音的正确方法。Javazoom的播放器应该提供一些方法。如果没有,那就是他们的目标的缺陷。另外,播放器的每个实例可能都应该在自己的线程中,而不是试图重用。如果被多个线程访问,您需要将播放器
设置为volatile
。感谢您的回复。我尝试创建一个调用sound.close的函数,在需要更改声音时关闭。但是,