Java启动和停止线程

Java启动和停止线程,java,multithreading,Java,Multithreading,我不知道如何在Java中停止线程 我有一个函数,它创建并启动线程。现在,当我启动程序时,我希望它启动线程。之后,如果按下按钮,我希望线程停止,当再次按下按钮时,我希望线程重新开始或继续(这无关紧要) 创建线程的函数: private void startRecordingUserInput() { AudioDispatcher dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(44100, 204

我不知道如何在
Java
中停止
线程

我有一个
函数
,它创建并启动
线程。现在,当我启动程序时,我希望它启动
线程
。之后,如果按下
按钮
,我希望
线程
停止,当再次按下
按钮
时,我希望
线程
重新开始或继续(这无关紧要)

创建
线程的
函数

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;

            }
        }
    });

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


你可以用很多方法来做

您可以使用

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

对于将来可能使用
TarsosDSP
并面临相同问题的任何人来说,最简单的方法是制作一个全局
dispatcher

dispatcher = AudioDispatcherFactory.fromDefaultMicrophone(22050,1024,0);
只需使用以下命令停止
线程

dispatcher.stop();

你的问题是什么?@Turing85我的问题是,当线程需要时,我如何启动和停止线程?我基本上会遵循这个例子(忽略其中的德语):。一个基本上是扩展一个线程并添加一个标志,可以从线程外部设置,例如在GUI线程中的侦听器中。如果标志已更改,则下次在run()-方法内同步检查If语句时,它将暂停任何进一步的处理。还有线程运行程序(如
SwingWorker
Runnable
等),可以减轻您的负担。您定义了runnable,但这似乎做了一些与GUI相关的事情,没有实际的处理。
AudioDispatcher
似乎是完成所有工作的部分。
Thread
中可用于实现所需功能的所有方法都标记为已弃用。如果你要使用例如
suspend()
resume()
,你就必须依靠
AudioDispatcher
来正确实现这些方法。正如我读到的那样,使用
destroy
stop
应该是不好的做法。我会用
synchronized(这个){…}来围绕暂停检查
为了避免在仍在求值时更改值,从而在执行检查时创建锁。我将错误的实践方法表示为:“您可以通过执行“正确”来“不安全地”停止线程。java中的Stop方法已经被弃用很长时间了。因此,恐怕阻止线程的唯一决定性方法是让它结束。但是,如果希望线程进入睡眠或等待,则可以调用thread.interrupt(),它将引发异常,如果处理得当,它将能够将您拉出。是的,您可以使用方法“isInterrupted()”而不是使用额外的标志“isPlaying”基本上,当我们调用thread.interrupt()时,它只会为中断设置一个标志true,并且isInterrupted()方法返回相同的标志。
dispatcher.stop();