在本地机器上,我有一个可运行的任务,我正在使用 future.cancel(true) 取消它,它返回 true,我看到 ThreadPoolTaskExecutor 没有待处理的任务。
但是在不同的环境(容器)中,我看到 future.cancel(true) 返回 true,但是 ThreadPoolTaskExecutor 不接受新任务,因为之前的任务没有被取消。
知道为什么会发生这种情况吗?这就是我正在做的。
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/