看来我应该能够区分 Futures 彼此,而不必维护两个 HashMap(或一个双向哈希)。
- 当作业提交给 ExecutorService 时, future 就已可知。添加 Future 以使用键“jobID”进行映射。
- 如果需要取消作业,请使用映射中的“jobID”检索 Future 并取消。
- 如果作业成功完成,Future 可以通过返回的对象(包含作业 ID)来识别。通过“jobID”从 map 中删除 Future。
- 如果作业被中断或抛出异常,则不会返回任何 Object,因此 Future 必须通过调用 Future.hashCode 或 Future.equals 与“jobID”进行匹配(因此,需要两个 HashMap 或一个双向第三方哈希) )。
我在这里遗漏了什么,还是这是预期的方法?我想重写 Future 以包含“getId”方法或其他方法,但根据执行器创建它们的方式,这似乎不可行。
编辑:我还尝试使用 ExecutorCompletionService 来等待作业完成。
最佳答案
永远不要使用java.util.concurrent.Future
。请改用 com.google.common.util.concurrent.ListenableFuture 或类似内容。
使用 ListenableFuture
,您可以在 ListenableFuture
完成时注册回调:
ListenableFuture<Integer> future = MoreExecutors.listeningDecorator(executor).submit(
new Callable<Integer>() {
@Override
public Integer call() throws Exception {
...
}
});
// Add jobId to the map. You should use a thread-safe Map!
map.put(jobId, future);
Futures.addCallback(future, new FutureCallback<Integer>(){
@Override
public void onSuccess(Integer result) {
map.remove(jobId);
...
}
@Override
public void onFailure(Throwable t) {
map.remove(jobId);
...
}});
关于java - 如何区分 Java Futures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23095934/