繁体   English   中英

Java启动和停止线程

[英]Java Start and Stop Threads

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

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

我创建Thread function

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;

            }
        }
    });

线程将一直运行直到其run方法完成为止,因此,如果要继续运行它,请在run方法中添加一个无限循环,然后在run方法内部为“ isPlaying == false”添加一个条件,然后中断该循环。 要在按钮上启动线程时,再次单击,然后使“ isPlaying = true”并调用thread.start()方法。

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

您可以通过多种方式做到这一点

您可以使用以下命令获取所有正在运行的线程

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(); }
 }

对于将来可能会使用TarsosDSPTarsosDSP相同问题的任何人,最简单的方法是创建一个全局dispatcher

dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0);

并以此stop Thread

dispatcher.stop();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM