【问题标题】:Interrupting a normally running thread in java中断java中正常运行的线程
【发布时间】:2014-06-08 00:07:47
【问题描述】:

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

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

代码sn-p是

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 处获得异常块,但是在那之后我如何停止线程,因为即使在该线程似乎继续正常进程之后。

对线程概念不熟悉,请帮忙..

【问题讨论】:

标签: java multithreading interrupted-exception


【解决方案1】:

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

【讨论】:

  • 这样才能写出漂亮的答案!
【解决方案2】:

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

停止执行 添加全局变量为

private volatile boolean exit = false;

和 您在第二堂课中添加一种方法

public void requestExit(){
  exit = true;
 }

在你的线程的run () 内做这样的事情

 if (exit == true){
    return;
   }

当你想调用时,只需从你的 main() 或你想停止的任何地方调用这个方法 requestExit()

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

如有任何问题请告诉我

【讨论】:

  • 感谢您的回复.. 在运行方法中我有一些 6 方法,我的疑问是我应该在哪里检查 (exit == true) ??它应该在 run() 中的每个方法调用之前存在吗?
  • 是的,最好保持在开头,但如果您希望某些方法强制执行,那么在这些方法调用之后放置此条件..
  • 是的,在运行方法的开头我有这个退出 == true 检查我的任务是,如果程序在 run() 中执行第三个方法,现在我中断线程,我只能在之后知道第三种方法完成执行?(因为我将在第四种方法之前进行 (exit == true) 检查)
  • 是的,这就是为什么我告诉你把它放在开头......如果你想让它在每一点停止然后把这个条件放在每个方法调用之前,这样每当你调用时,它就会停止...但是如果您的方法在两者之间执行,则只有在您的方法中放置相同的停止逻辑时才能停止...这取决于您想要停止的位置
【解决方案3】:

线程仅在其run() 方法在堆栈上时才运行,因此通常人们将while(true) 放在run 方法中,您需要在线程中停止它只需在运行中的某个位置return方法或中断循环,然后一旦run() 方法不再运行,线程就停止了。

【讨论】:

  • 如果run方法的执行在中途,我怎么能使用基于中断标志的return或break循环??
猜你喜欢
  • 2014-09-11
  • 1970-01-01
  • 2018-02-08
  • 2018-09-14
  • 2017-03-22
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多