发布
社区首页 >问答首页 >无法使用SingleThreadExecutor取消正在运行的任务

无法使用SingleThreadExecutor取消正在运行的任务
EN

Stack Overflow用户
提问于 2011-04-28 14:43:57
回答 3查看 696关注 0票数 0

我有实现Runnable的类:

代码语言:javascript
代码运行次数:0
复制
public class Abc implements Runnable{
    public synchronized void run(){
        while(!(Thread.currentThread().isInterrupted() || someCondition())){
           doSomething();
           try{
               this.wait(SOME_TIME);
           } catch(InterruptedException ex){
            logger.error("Ex",ex);
            Thread.currentThread.interrupt();
               }
}}}

在提交到线程池后,我想取消它,并中断它。

代码语言:javascript
代码运行次数:0
复制
futureTask.cancel(true);

但是今天我的Runnable对象停止了接收中断。我已注销中断状态: false。不抛出InterruptedException。有什么建议吗?出什么问题了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-09 22:00:31

已解决

这实际上是非常棘手的竞争条件。我一直在从gui线程启动任务,并从网络阅读器线程取消它。我不能解释为什么log4j不显示记录器,但是更好的线程控制解决了我的问题。你的回答帮助我找到了一个解决问题的想法,谢谢。

当昨天某些东西工作但今天不起作用时-可能是它的竞争条件或死锁。:-)

票数 0
EN

Stack Overflow用户

发布于 2011-04-28 15:23:04

我的猜测是中断被doSomething占用了,或者doSomething被占用(没有返回)

在这样的循环中使用wait()向我表明,您有一个更适合使用并发库的控制流。你能提供更多关于你正在等待的细节吗?

顺便说一句,如果你把try/cath移到循环之外,它将会简化它。

票数 1
EN

Stack Overflow用户

发布于 2011-04-28 15:28:02

首先,您的代码片段甚至不能编译:您缺少大括号,Thread.currentThread是一个方法而不是一个实例变量。那么,您是否在doSomething方法中调用Thread.interrupted()?如果是:它清除线程的中断状态,这样等待就不会被中断,currentThread().isInterrupted()将返回false。

您也不需要在while子句中重新检查中断状态,也不需要在线程被迭代时重新中断它。这看起来更好(并且捕获了你的doSomething可能抛出的异常):

代码语言:javascript
代码运行次数:0
复制
  public synchronized void run() {
    try {
      while (!someCondition()) {
        doSomething();
        wait(SOME_TIME);
      }
    } catch (InterruptedException ie) {
      logger.error(ie);
    } catch (Exception e) {
      logger.error(e);
    }
  }

@Peter:移动try/catch,这绝对是个好建议!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5814677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档