我正在编写一个程序的GUI,它接受一些输入并对它们运行算法。该算法的代码相当长且复杂,所以我刚刚从GUI启动一个新线程,以便对输入执行计算。
//algorithmThread previously initialized
if(e.getSource() == startButton) {
if(update.updateStrings(textFields)) {
algorithmThread.start();
}
}
我们希望添加一些功能,允许用户在提供错误的输入文件的情况下停止计算(在产生结果之前在我的笔记本电脑上运行大约半小时)。这就是我处理它的方式。
else if(e.getSource() == stopButton) {
//if the user presses the stop button then intterupt the
//thread running the algorithm
algorithmThread.interrupt();
System.out.println("algorithm stopped"); //debugging code
//recreate the thread in case the user hits the start button again
algorithmThread = new Thread() {
public void run() {
runNOC();
}
};
}
程序确实成功停止了算法(虽然我认为我应该做一些异常处理),允许用户输入新的输入,然后重新启动。我的问题是,在什么条件下我必须检查算法代码中的Thread.interrupted()?这是必要的/最佳实践吗?或者以上述方式停止线程是否可以接受?
答案 0 :(得分:4)
所有Thread.interrupt()
方法都设置为“中断”标志,因此以这种方式停止线程需要它的合作。例如,算法应该每隔一段时间轮询一次中断状态,例如每次迭代一次。您可以在Java concurrency tutorial中找到相关示例。
由于您正在使用GUI,您可能会发现使用SwingWorker
运行后台线程更容易。此类具有许多便于GUI编程的功能,例如在使用done
方法完成计算时更新GUI,而使用canceling the computation而不使用Thread.interrupt()
。以这种方式取消仍然需要来自线程的合作,但是更安全,因为在某些情况下中断线程会导致InterruptedException
抛出,例如当线程在Thread.sleep
中休眠或等待锁定时在Object.wait
。
答案 1 :(得分:0)
interrupt
在这个帖子后并不总是邪恶的:
Is Thread.interrupt() evil?
在这里,我们在一个特定的地方使用这种方法:处理 InterruptedExceptions。这可能看起来有点奇怪,但这就是什么 它看起来像在代码中:
try {
// Some code that might throw an InterruptedException.
// Using sleep as an example
Thread.sleep(10000);
}
catch (InterruptedException ie) {
System.err.println("Interrupted in our long run. Stopping.");
Thread.currentThread().interrupt();
}
这对我们来说有两件事:
避免吃掉中断异常。 IDE自动异常处理程序 总是为你提供像ie.printStackTrace();和a jaunty“TODO:有用的东西需要去这里!”评论。
- 醇>
它恢复 中断状态,而不强制检查此异常 方法。如果您正在实现的方法签名没有 抛出InterruptedException子句,这是你的另一个选择 传播中断状态。