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

标签 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";
    }
}

最佳答案

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

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

关于java - Future.cancel(true) 返回 true 但任务未取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56680101/

相关文章:

java - ArrayBlockingQueue NoSuchElementException

java - 在没有运行服务器的情况下测试 WebService 的响应代码

c++ - MySQL C API : Segmentation Fault when running query from different thread

java.lang.ClassCastException : java. lang.String 无法转换为 com.security.model.UserRequest

c++ - 并行执行不会更新我的变量

c++ - 如何在运行时将信息传递给线程?

java - 启动新线程而不是放入队列

java - 在 Eclipse 中使用 get Thread Alsigned Bytes() 获取编译错误

java - 映射时忽略 null 或 Optional.empty 值

Java设置差异,我可以使用java对象还是数据库?