gpt4 book ai didi

java - 停止线程并运行一些清理代码的最安全/最佳方法是什么

转载 作者:行者123 更新时间:2023-12-01 12:43:07 25 4
gpt4 key购买 nike

作为我在 Java 中实现语音识别程序的一部分,我在单独的线程中实现了实际的语音识别代码。主线程处理 GUI 界面,并在识别单词时从语音识别线程接收不断的更新。

当用户单击主线程上 GUI 中的“退出”按钮时,我希望该线程立即运行一些清理代码并终止。

我目前有以下内容:

public class VoiceRecognitionCore extends SwingWorker<List<String>, String>
{
//Variables and things here

@Override
public List<String> doInBackground() throws VoiceRecognitionException
{
//Code here
while(continueVoiceRecog == true)
{
//More code
Result result = recog.recognize();
//More code
}
}
}

我依靠 while 循环不断检查 continueVoiceRecog 的状态,当用户单击“退出”时,主线程将其设置为 false。

当前的问题是代码有时会永久位于 recog.recognize() 方法中,因此它永远不会返回到 while 检查。应该指出的是,这始终是一个临时解决方案。

我正在考虑扩展 doInBackground() 来捕获 InterruptedException 并将使用线程中断,该中断将调用清理方法来释放正在使用的任何资源。

对于这种情况,最安全/最好的方法是什么?如果这是我的提议,是否有任何我应该注意的潜在问题?

最佳答案

使用线程中断是完全可以接受的途径 - 但是在您的示例中(使用 SwingWorker),您可以使用 cancel() 方法。

在创建 VoiceRecognitionCore 后的调用代码中,您可以 cancel() 工作退出按钮操作监听器:

    final VoiceRecognitionCore worker = new VoicRecognitionCore();
worker.execute();

JButton exitButton = new JButton("Exit");
exitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// True passed to Interrupt the underlying thread.
worker.cancel(true);
// other clean-up
// then System.exit(0); ?
}
});

但是,此方法需要检查 recognize() 方法中的 Thread.isInterrupted() 的状态。 (参见链接:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/cancel.html)

如果您需要清理内容并且无法检查 isInterrupted() 标志 - 也许最好的方法是使用一种方法来确定您的 >recog 对象正在识别中...当按下退出按钮时 - 如果 recog.isRecognizing() 然后进行清理然后退出?

PS。有人可能会争辩说,如果您正在执行 System.exit(0);无论如何,那么干净地退出该循环可能是不必要的...但这取决于您是否在那里进行其他清理...例如完成写入文件等。

关于java - 停止线程并运行一些清理代码的最安全/最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com