java - 如何区分 Java Futures?

标签 java concurrency java.util.concurrent

看来我应该能够区分 Futures 彼此,而不必维护两个 HashMap(或一个双向哈希)。

  1. 当作业提交给 ExecutorService 时, future 就已可知。添加 Future 以使用键“jobID”进行映射。
  2. 如果需要取消作业,请使用映射中的“jobID”检索 Future 并取消。
  3. 如果作业成功完成,Future 可以通过返回的对象(包含作业 ID)来识别。通过“jobID”从 map 中删除 Future。
  4. 如果作业被中断或抛出异常,则不会返回任何 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/

相关文章:

具有 Future 返回类型的 Scala 递归函数

java - Kony Web 应用程序在并发服务调用上有 Object.wait()

java - 如何正确使用concurrentskiplistmap?

java - 如何解决 HTTP 404 源服务器未找到目标资源的当前表示

java - 如何在 Maven 项目中使用 JFrog Artifact 存储库

java:用于存储挂起的网络请求的线程安全数据结构(队列+映射)?

java - 在java中,如何使用最多N个线程处理有界队列中的项目,并且N可调?

java - 将 FTP 代理与 apache commons-net 一起使用

java - 与 salesforce 的双向同步 (java)

C++ 条件变量 cin 和 cout