给出一个需要花费大量时间才能完成的功能,并且该功能应该是非阻塞的,因此提供了一个使用completableFuture的接口,例如:
public CompleteableFuture<Item> getItem();
现在,我想将此功能应用于需要获取一项,进行一些计算然后获取下一项直到不再有其他项的情况。使用递归可能看起来像这样:
processOneItem() {
CompleteableFuture future = new CompletableFuture();
getItem().thenAccept((Item item) -> {
if (item != null) {
// do some stuff
processOneItem().thenAccept(() -> { future.complete() })
} else {
future.complete();
}
})
return completableFuture;
}
现在,由于尚不清楚要处理多少个项目,使用递归方法可能是一个坏主意,因为可能会出现堆栈溢出。
但是,如何在不使用递归的情况下实现这一点并且仍然保持非阻塞状态?