我有几个异步方法(Annotatad @Asynchronous)返回未来对象。我必须立即执行它们,但是我可以获得第一个准备就绪的结果,是否有适用于Java EE容器的安全解决方案?
谢谢!
答案 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
}
};
但要小心:此代码在工作线程内执行,而不是原始线程。