获得第一个可用的AsyncResult

时间:2015-09-14 12:40:40

标签: java java-ee

我有几个异步方法(Annotatad @Asynchronous)返回未来对象。我必须立即执行它们,但是我可以获得第一个准备就绪的结果,是否有适用于Java EE容器的安全解决方案?

谢谢!

3 个答案:

答案 0 :(得分:1)

此工具没有标准API。只需在实用程序方法中在当前线程的无限循环中检查Future#isDone(),如下所示:

public static <T> Future<T> getFirstDone(List<Future<T>> futures) {
    while (true) {
        for (Future<T> future : futures) {
            if (future.isDone()) {
                return future;
            }
        }

        // Break if necessary infinite loop here once it reaches certain timeout.
    }
}

用法:

List<Future<Foo>> results = collectThemSomehow();
Future<Foo> firstDoneResult = getFirstDone(results);
// ...

答案 1 :(得分:0)

以下是一个如何使用Spring的示例。在此示例中,异步作业只返回一个布尔值。

public void example(Job job) throws Exception
{
    Future<Boolean> executor = jobExecutor.doJob(job);

    //wait to be done
    while (!executor.isDone()) {
        Thread.sleep(10);
    }

    System.out.println(executor.get());
}

作业执行程序类是@Component的注释。

@Async
public Future<Boolean> doJob(Job job) throws Exception { 
    boolean isSuccessful;
    //do something
    return new AsyncResult<Boolean>(isSuccessful);
}

答案 2 :(得分:0)

有时你可以反转它 - 将函数指针传递给异步方法并调用它:

  AtomicBoolean executed = new AtomicBoolean(false);
  Runnable r = () ->{
        if(!executed.getAndSet(true)){
            //do job
        }
  };

但要小心:此代码在工作线程内执行,而不是原始线程。