4

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

4

2 回答 2

4

Thread.interrupt()方法所做的只是设置一个“中断”标志,因此以这种方式停止线程需要它的合作。例如,算法应该每隔一段时间轮询一次中断状态,例如每次迭代一次。您可以在Java 并发教程中看到一个示例。

由于您使用的是 GUI,您可能会发现使用SwingWorker. 这个类有很多方便GUI编程的特性,比如使用该方法计算完成后更新GUI,不使用该done方法取消计算Thread.interrupt()。以这种方式取消仍然需要线程的合作,但更安全,因为InterruptedException在某些情况下中断线程会导致抛出 an ,例如当线程正在休眠Thread.sleep或等待锁定时Object.wait

于 2013-09-29T16:53:30.063 回答
0

interrupt在这个线程之后并不总是邪恶的: Thread.interrupt() 是邪恶的吗?

在这里,我们在一个特定的地方使用此方法:处理 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(); 和一个活泼的“TODO:这里需要一些有用的东西!” 评论。

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

于 2013-09-29T17:33:50.240 回答