Java 通过CompletionService检查已取消的任务

Java 通过CompletionService检查已取消的任务,java,java-8,future,java.util.concurrent,completion-service,Java,Java 8,Future,Java.util.concurrent,Completion Service,我正在研究CompletionService类,我发现将提交队列与Completion队列分离非常有用 但我也错过了一种投票/接受已取消任务的方式(在某种程度上可以认为已完成)。这件事能很容易做到吗 Future<String> task1Future = completionService.submit(myCallableTask1); Future<String> task2Future = completionService.submit(myCallable

我正在研究CompletionService类,我发现将提交队列与Completion队列分离非常有用

但我也错过了一种投票/接受已取消任务的方式(在某种程度上可以认为已完成)。这件事能很容易做到吗

Future<String> task1Future =  completionService.submit(myCallableTask1);
Future<String> task2Future =  completionService.submit(myCallableTask2);
task2Future.cancel();
Future<String> lastComplTaskFuture = completionService.take(); 
                        //Seems to return only the completed or 
                        //interrupted tasks, not those cancelled (task2)
但事实是:

'A' job completed successfully.
Unknown job was cancelled.
Unknown job was cancelled.
Unknown job was cancelled.

我甚至尝试使用PriorityBlockingQueue作为CompletionService的队列,使用了Comparator.Comparating(Future::isCancelled).reversed(),但它也不起作用(我想如果元素状态发生变化,它不会求助于此)

您正在使用单个线程将任务提交到线程池

您提交的第一个任务将使用该线程(短时间睡眠)

其他人将在
ExecutorService
中排队。取消相应的未来不会从该队列中删除相应的任务。它只是改变未来的状态

任务将保留在队列中,直到线程可以自由处理它们。线程将注意到相应的
Future
被取消,并同时取消整个任务。这时,
CompletionService
很快就知道它们已“完成”


考虑增加线程池的大小。

您的代码对我来说运行良好,并返回一个已取消的
未来
。我可能做过假设(例如,
cancel
需要一个
boolean
参数)。请发布MCVE。@Sotirios Delimanolis,但它是否返回“中断的”取消的期货(即,在基础任务处于活动状态时中断的期货)或“丢弃的”取消的期货(即,在排队时已取消且尚未运行的期货)?如果是后者,那么我的队列或线程池设置中肯定存在某种问题。这两者都有。两个
未来
都被取消
返回
@Sotirios Delimanolis请检查我的编辑,我认为我们陈述的每一个前提都有一点真实性如果你运行作业a、b和c,我无法重现;a工作时取消b和c;最后轮询CompletionService,直到a taks终止,才会通知b和c的取消。完全请提供发生这种情况的MCVE,并为您的客户提供另一个MCVE,[…]。
Unknown job was cancelled.
Unknown job was cancelled.
Unknown job was cancelled.
'A' job completed successfully.
'A' job completed successfully.
Unknown job was cancelled.
Unknown job was cancelled.
Unknown job was cancelled.