Future.cancel(true)返回true,但任务未取消

时间:2019-06-20 06:22:29

标签: java multithreading threadpool future

在本地计算机上,我有一个可运行的任务,正在使用future.cancel(true)取消,该任务返回true,并且我看到ThreadPoolTask​​Executor没有待处理的任务。

但是,在另一个环境(它是一个容器)上,我看到future.cancel(true)返回true,但是ThreadPoolTask​​Executor不接受新任务,因为先前的任务不会被取消。

为什么会发生这种情况?这就是我在做什么。

Task task = new Task();
Future<String> future = threadPoolTaskExecutor.submit(task);

// wait for some time
boolean val = future.cancel(true)

// still cannot submit more tasks

private class Task implements Callable<String> {
    @Override
    public String call() throws InterruptedException {
        Thread.sleep(10000);
      return "value";
    }
}

1 个答案:

答案 0 :(得分:0)

JavaDoc可能更清晰,但是cancel的实际作用是取消将来并有选择地中断其线程。如果成功,则返回true。但是,不能保证线程实际上会因此终止。在mayInterruptIfRunning的情况下,如果线程不能在所有位置正确处理InterruptedException,则可能发生这种情况。

例如参见FutureTask.cancel的源代码。

相关问题