我必须使用thread.interrupted()吗?

时间:2013-09-29 16:41:06

标签: java multithreading

我正在编写一个程序的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()?这是必要的/最佳实践吗?或者以上述方式停止线程是否可以接受?

2 个答案:

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

这对我们来说有两件事:

     
      
  1. 避免吃掉中断异常。 IDE自动异常处理程序   总是为你提供像ie.printStackTrace();和a   jaunty“TODO:有用的东西需要去这里!”评论。

  2.   
  3. 它恢复   中断状态,而不强制检查此异常   方法。如果您正在实现的方法签名没有   抛出InterruptedException子句,这是你的另一个选择   传播中断状态。

  4.