Java如何启动和停止线程?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (492)

我有一个function创建Thread然后开始。现在,当我启动程序时,我希望它启动Thread。之后,如果button按下,那么当button又被按下了我想要Thread停止,我要重新开始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 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;

            }
        }
    });
提问于
用户回答回答于

可以让所有正在运行的线程

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(); }
 }
用户回答回答于

一个线程运行直到它的run方法完成,所以如果想继续运行它,然后在run方法中添加一个无限循环,然后在run方法中添加一个条件为“isPlaying == false”,然后打破循环。再次,当你想在按钮上点击启动线程,然后使“isPlaying = true”并调用thread.start()方法。

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励