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