Java启动和停止线程

时间:2018-06-11 18:56:07

标签: java multithreading

我无法弄清楚如何在Thread中停止Java

我有function创建Thread并启动它。现在,当我启动程序时,我希望它启动Thread。之后如果按下button,我希望Thread停止,再次按下button时,我希望Thread重新开始或恢复({没关系)。

我的function创建了Thread

private void startRecordingUserInput() {
    AudioDispatcher dispatcher =
            AudioDispatcherFactory.fromDefaultMicrophone(44100, 2048, 0);


    PitchDetectionHandler pdh = new PitchDetectionHandler() {
        @Override
        public void handlePitch(PitchDetectionResult res, AudioEvent e) {
            final float pitchInHz = res.getPitch();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    pitchText.setText("" + pitchInHz);
                    gameView.setSingerArrowPitch(pitchInHz);
                    gameView.setCurrentTime(mid);
                    gameView.invalidate();
                }
            });
        }
    };
    AudioProcessor pitchProcessor = new PitchProcessor(PitchProcessor.PitchEstimationAlgorithm.FFT_YIN, 44100, 2048, pdh);
    dispatcher.addAudioProcessor(pitchProcessor);

    Thread audioThread = new Thread(dispatcher, "Audio Thread");
    audioThread.start();
} 

我启动它的部分,希望start/stop Thread

    //Start the Thread
    startRecordingUserInput();

    playRecordButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(!isPlaying){

                //Start the Thread again if it is not running or 
                //make a new one

                isPlaying = true;

            } else if(isPlaying){

                //Stop the Thread

                isPlaying = false;

            }
        }
    });

3 个答案:

答案 0 :(得分:0)

线程一直运行直到其run方法完成,所以如果你想继续运行它,那么在run方法中添加一个无限循环,然后在run方法中为" isPlaying == false"添加一个条件。然后打破循环。 再次当你想要按下按钮时启动线程然后make" isPlaying = true"并调用thread.start()方法。

public void run() {
   while(true) {
      if(!isPlaying) {
         break;
      }
      // Do other stuff here.
   }
}

答案 1 :(得分:0)

你可以通过多种方式实现

您可以使用

获取所有正在运行的线程
Thread.getAllStackTraces()

你可以通过

“不安全地”停止一个线程
Thread t;
t.stop(); 
//or
t.destroy();
//or 
t.suspend();
//Or to resume
t.resume();

或者,您可以走安全路线,学习同步,并使用

Thread t;
t.wait();
t.notify();

此外,这不会一直有效,但你可以做到

 boolean pause() { isPaused = !isPaused; }

 @Override
 public void run() {
      while (running) { if (!isPaused) doThread(); }
 }

答案 2 :(得分:0)

对于未来可能会使用mat且面临同样问题的任何人,最简单的方法是制作全球TarsosDSP

dispatcher

只需dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0); stop即可:

Thread