gpt4 book ai didi

java - 如何区分 Java Futures?

转载 作者:行者123 更新时间:2023-11-30 09:09:20 24 4
gpt4 key购买 nike

看来我应该能够区分 Futures 而无需维护两个 HashMap(或一个双向哈希)。

  1. 当作业提交给 ExecutorService 时, future 就知道了。添加 Future 以使用键“jobID”进行映射。
  2. 如果需要取消作业,请在 map 中使用“jobID”来检索 Future 并取消。
  3. 如果作业成功完成,Future 可以通过返回的对象(包含作业 ID)来识别。通过“jobID”从 map 中删除 Future。
  4. 如果作业中断或抛出异常,则不会返回任何对象,因此 Future 必须通过调用 Future.hashCode 或 Future.equals(因此,两个 HashMap 或一个双向第三方哈希)与“jobID”匹配).

我是不是遗漏了什么,或者这是预期的方法?我想覆盖 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com