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

时间:2011-04-28 06:43:57

标签: java threadpool

我有实现Runnable的类:

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

将它提交给线程池之后我想取消它,中断。

futureTask.cancel(true);

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

3 个答案:

答案 0 :(得分:1)

我的猜测是doSomething消耗了中断,或者doSomething被绑定了(没有返回)

在这样的循环中使用wait()告诉我你有一个更适合使用Concurrency库的控制流。你能否提供一些关于你在等什么的更多细节?

BTW,如果你将try / cath移动到循环外部,它会简化它。

答案 1 :(得分:0)

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

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

  public synchronized void run() {
    try {
      while (!someCondition()) {
        doSomething();
        wait(SOME_TIME);
      }
    } catch (InterruptedException ie) {
      logger.error(ie);
    } catch (Exception e) {
      logger.error(e);
    }
  }

@Peter:移动尝试/捕捉,这绝对是一个很好的建议!

答案 2 :(得分:0)

解决

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

当一些事情在昨天工作但今天没有 - 可能是它的竞争状态或死锁。 : - )