在本地计算机上,我有一个可运行的任务,正在使用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";
}
}
答案 0 :(得分:0)
JavaDoc可能更清晰,但是cancel
的实际作用是取消将来并有选择地中断其线程。如果成功,则返回true
。但是,不能保证线程实际上会因此终止。在mayInterruptIfRunning
的情况下,如果线程不能在所有位置正确处理InterruptedException
,则可能发生这种情况。
例如参见FutureTask.cancel
的源代码。