在Java8中等待任何未来,而不创建每个未来的线程

在Java8中等待任何未来,而不创建每个未来的线程,java,java-8,future,Java,Java 8,Future,我有一个期货集合,我想等待其中的任何一个,这意味着有一个阻塞调用,它将在任何期货完成后返回 我看到了CompletableFuture.anyOf(),但如果我正确理解了它的代码,它会为每个未来创建一个线程,如果在Java中可能的话,我希望在资源方面使用一种不那么浪费的方法。直接的答案是肯定的,下面是一个示例方法 private CompletableFuture waitAny(List allFutures)抛出InterruptedException{ Thread-Thread=Thre

我有一个期货集合,我想等待其中的任何一个,这意味着有一个阻塞调用,它将在任何期货完成后返回


我看到了CompletableFuture.anyOf(),但如果我正确理解了它的代码,它会为每个未来创建一个线程,如果在Java中可能的话,我希望在资源方面使用一种不那么浪费的方法。

直接的答案是肯定的,下面是一个示例方法

private CompletableFuture waitAny(List allFutures)抛出InterruptedException{
Thread-Thread=Thread.currentThread();
而(!thread.isInterrupted()){
for(CompletableFuture:allFutures){
if(future.isDone()){
回归未来;
}
}
睡眠(50L);
}
抛出新的InterruptedException();
}
第二种选择

private CompletableFuture waitAny(List allFutures)抛出InterruptedException{
CompletableFuture any=新的CompletableFuture();
for(CompletableFuture:allFutures){
future.handleAsync((t,可丢弃)->{
任何。完成(未来);
返回null;
});
}
试一试{
返回any.get();
}捕获(执行例外){
抛出新的非法状态异常(e);
}
}
但整个任务的背景还不清楚,
可能还有更好的解决方案。

如果需要微调线程行为,请创建一个新的线程,并对其进行展望。例如,使用
invokeAny​。使用创建服务实例,您还可以在这里定义线程限制。“如果我正确理解了它的代码,它将在将来创建一个线程”-您在哪里看到的?文档中根本没有指定线程行为。在过去的几年里,我并没有真正看到这样的事情,至少不明显。它可能像该类中的其他方法一样使用默认的executor服务,它根据需求动态地增长和收缩线程池。尝试按照
tryFire
方法进行操作。无论您查看的是哪个版本,
anyOf
都不会创建新线程。哪一个是“相关代码段”,其中没有发生任何事情?这不是
CompletableFuture
的工作方式。除非使用
…Async
方法之一,否则不会创建线程。而
…Async
方法仅在它们所委托的执行器执行时创建线程。由于
anyOf
不等待,因此没有等待代码显示
anyOf
返回一个新的
CompletableFuture
,只有在调用
get
join
时,线程才会被阻塞。无论哪个线程完成了指定的未来之一,都将取消阻止您的线程。