2014-01-25 6 views
1

Я пытаюсь создать класс для воспроизведения файлов 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

вы можете показать свой код snippert ? –

+0

Одна вещь, player.decode (файл) работает неограниченное время? –

+0

Он работает до конца песни. – cyprieng

ответ

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 
+0

Большое спасибо, что отлично работает! – cyprieng

+0

@cyprieng: У вас есть код, в котором вы в конечном итоге работали? Я в той же ситуации, в которой ты был! Благодарю. :-) – JoshuaD

0

Вы не можете приостановить поток Java, и вы все равно не хотите.

Код, который вы используете, представляет собой простое примерное приложение, которое не содержит способа приостановки воспроизведения. Вы должны проверить source for the Player class; содержащийся там код более сложный, но дает вам больше контроля над процессом воспроизведения, без сомнения, включая также возможность приостановки.

+0

Я уже видел этот код, но я не могу ни увидеть, как сделать паузу в этом коде. – cyprieng

0

вы можете решить проблему, прервав нить. когда вы прерываете поток, он должен выкинуть прерванное исключение, поймать исключение и сделать блокировку ожидания для объекта там. когда вы хотите возобновить, просто вызовите уведомление об объекте.

Object lock=new Object(); 

@Override 
public void run() { 
    try { 
     player.decode(file); 
    } catch (InterruptedException e) { 

     synchronized(lock) 
     { 
     lock.wait(); 
     }  

    } 
+0

Не может этого сделать, потому что «try body никогда не выбрасывает InterruptedException». – cyprieng

+0

вызов this.playerThread.interrupt(); –

1

В общем, потоки должны быть остановлены установкой некоторой переменной (с использованием соответствующей синхронизации), периодически проверяемой потоком. Затем поток отвечает за остановку себя. То же самое касается подвески - они могут проверять переменную, а затем sleep какое-то время.

Приостановка потока, в котором код не находится под вашим контролем, опасен, потому что вы не знаете, что он делает. Возможно, он захватил кучу сетевых портов (на мгновение, подумал он), и теперь вы приостановили его, и эти порты таинственно недоступны. Может быть, он делает некоторые вещи в реальном времени, и когда вы его возобновите, он будет в совершенно разбитом состоянии.

Это, пожалуйста, прочитайте и поймите why Thread.stop and friends are deprecated. В принципе, это не потому, что они сами сломаны, а потому, что они часто приводят к потере кода. Однако, если вы понимаете риски и код, с которым работаете, нет ничего по своей сути неправильно с их вызовом.

 Смежные вопросы

  • Нет связанных вопросов^_^