1

我试图中断一个正常运行的线程(它不处于 sleep() 或 wait() 状态)。

在上网时,我知道中断正常运行的线程只会将标志设置为真并继续该过程。

代码片段是

one.java

......
......
actionperformedmethod {

if (actionCmd.equals("cancel")) {
    try {
        r1.stop();  // to two.java
    } catch (InterruptedException ex) {
        ....
        ....
    }
}
}

two.java

.....
.....
stop method() throws InterruptedException{
        if(!(t.isInterrupted())){
            t.interrupt();
            throw new InterruptedException();
        }
}

从 two.java 当我抛出 InterruptedException 时,我可以在 one.java 处获得异常块,但是在那之后我如何停止线程,因为即使在该线程似乎继续正常进程之后。

我是线程概念的新手,请帮助..

4

3 回答 3

4

interrupt()方法是合作的,而不是先发制人的——后台任务需要以Thread.interrupted()适当的时间间隔主动检查,并采取措施彻底关闭自己。

public void run() {
  openSomeResources();
  try {
    while(notFinished) {
      if(Thread.interrupted()) return;
      doSomeStuff();
    }
  } finally {
    closeTheResources();
  }
}

在这个例子中,如果线程在中间被中断,doSomeStuff()那么它将在响应中断之前完成当前的“迭代”。在一方面迅速响应中断和另一方面仅在执行中的安全点响应之间取得正确的平衡,是特定于特定任务固有的东西——没有一刀切——全部回答。

但是请注意,任何抛出异常的阻塞方法都将在抛出此异常InterruptedException重置中断标志。因此,为了使这种检查起作用,您必须在收到一个InterruptedException

try {
  Thread.sleep(3000);
} catch(InterruptedException e) {
  // we were interrupted - set the flag so the next interrupted() check will
  // work correctly.
  Thread.currentThread().interrupt();
}
于 2014-04-23T09:29:15.193 回答
2

中断不会停止线程。它只是将标志设置为 true 以指示线程尽快停止执行。

停止执行添加全局变量为

private volatile boolean exit = false;

然后在第二堂课中添加一种方法

public void requestExit(){
  exit = true;
 }

run ()你的线程里面做这样的事情

 if (exit == true){
    return;
   }

每当您想调用时,只需从您的 main() 或您想停止的任何地方调用此方法 requestExit()

这是停止线程的最佳方法。在线程上使用 stop() 是危险的,因为它不会清除任何资源,并且即使是 oracle 也不建议使用它,因此不推荐使用。

让我知道任何问题

于 2014-04-23T09:20:45.920 回答
0

run()线程仅在其方法位于堆栈上时才运行,因此通常人们while(true)在 run 方法中放置一个,您需要在线程中执行的所有操作以停止它是在 run 方法中的某个位置或在该方法return完成后立即中断循环run()不再运行的线程已停止。

于 2014-04-23T09:13:33.057 回答