如何在运行方法中暂停线程而不控制循环

时间:2014-01-25 15:57:28

标签: java multithreading flac

我尝试创建一个类来播放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) {
    }
}

谢谢!

4 个答案:

答案 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