我尝试创建一个类来播放FLAC文件。为此我使用jFlac。所以,为了播放一首歌,我需要这样做:
Player p = new Player();
p.decode("PATH_TO_FLAC");
我把它放在我班级的run()方法中。如果我启动线程,那就可以了。但我想知道如何暂停。我无法控制p.decode();
中的循环,因此我无法使用wait和notify。但Thread.suspend()
已被弃用。我不知道该怎么做。
我的课程:
public class FLACPlayer implements Runnable {
/**
* Path of the song
*/
private String file;
private org.kc7bfi.jflac.apps.Player player;
/**
* The thread launching the player
*/
private Thread playerThread;
/**
* Constructor: initialize the player
*
* @param str
* The path of the file to play
*/
public FLACPlayer(String str) {
file = str;
player = new org.kc7bfi.jflac.apps.Player();
this.playerThread = new Thread(this, "AudioPlayerThread");
}
public void play() {
playerThread.start();
}
@Override
public void run() {
try {
player.decode(file);
} catch (IOException | LineUnavailableException e) {
}
}
谢谢!
答案 0 :(得分:1)
通常,应该通过设置一些由线程定期检查的变量(使用适当的同步)来停止线程。然后线程负责停止自己。暂停相同 - 他们可以检查变量,然后sleep
一段时间。
暂停代码不在您控制范围内的线程是危险的,因为您不知道它在做什么。也许它抓住了一堆网络端口(只是片刻,它认为),现在你已经暂停了它,这些端口神秘不可用。也许它正在做一些实时的东西,当你恢复它时,它将处于一个完全破碎的状态。
那就是说,你应该阅读并理解why Thread.stop
and friends are deprecated。基本上,它不是因为它们本身已经坏了,而是因为它们经常导致代码损坏。但是,如果您了解风险和您正在使用的代码,那么调用它们本身就没有任何错误。
答案 1 :(得分:0)
无论如何,你不能暂停Java线程,而你也不想。
您使用的代码只是一个简单的示例应用程序,它不包含任何暂停播放的方法。你应该查看source for the Player
class;包含在那里的代码更复杂,但是让你可以更好地控制播放过程,无疑还包括暂停的能力。
答案 2 :(得分:0)
您可以通过中断线程来解决问题。当你中断一个线程时,它会抛出一个中断的异常,捕获异常并对那里的对象进行等待锁定。当你想要恢复时,只需在对象上调用notify。
Object lock=new Object();
@Override
public void run() {
try {
player.decode(file);
} catch (InterruptedException e) {
synchronized(lock)
{
lock.wait();
}
}
答案 3 :(得分:0)
我认为你已经弄明白自己如何实现这一点 - 但正如弗拉维奥建议你可以做到以下
应该覆盖PCMProcessors中的此方法 -
public void processPCM(ByteData pcm) {
synchronized (pcmProcessors) {
int suspensionValue=0;
Iterator it = pcmProcessors.iterator();
while (it.hasNext()) {
//DEFINE THE FLAG FOR SUSPENSION HERE - Logic should be block set ???
PCMProcessor processor = (PCMProcessor)it.next();
processor.processPCM(pcm);
}
}
}
DEFINE A Variable : volatile int flag=Threshold.Value
Poll this from the main thread which kicks DECODE method
Sleep and Resume for whatever time you want