我试图理解 CompletableFutures 和返回已完成期货的调用链,我创建了下面的示例,它模拟了对数据库的两次调用。
第一个方法应该是用 userIds 列表给出一个可完成的未来,然后我需要调用另一个方法提供 userId 来获取用户(在本例中是一个字符串)。
总结一下:
1. 获取 ID
2. 获取与这些 ID 对应的用户列表。
我创建了简单的方法来模拟休眠线程的响应。请检查下面的代码
public class PipelineOfTasksExample {
private Map<Long, String> db = new HashMap<>();
PipelineOfTasksExample() {
db.put(1L, "user1");
db.put(2L, "user2");
db.put(3L, "user3");
db.put(4L, "user4");
}
private CompletableFuture<List<Long>> returnUserIdsFromDb() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("building the list of Ids" + " - thread: " + Thread.currentThread().getName());
return CompletableFuture.supplyAsync(() -> Arrays.asList(1L, 2L, 3L, 4L));
}
private CompletableFuture<String> fetchById(Long id) {
CompletableFuture<String> cfId = CompletableFuture.supplyAsync(() -> db.get(id));
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("fetching id: " + id + " -> " + db.get(id) + " thread: " + Thread.currentThread().getName());
return cfId;
}
public static void main(String[] args) {
PipelineOfTasksExample example = new PipelineOfTasksExample();
CompletableFuture<List<String>> result = example.returnUserIdsFromDb()
.thenCompose(listOfIds ->
CompletableFuture.supplyAsync(
() -> listOfIds.parallelStream()
.map(id -> example.fetchById(id).join())
.collect(Collectors.toList()
)
)
);
System.out.println(result.join());
}
}
我的问题是,join call ( example.fetchById(id).join()) 是否破坏了进程的非阻塞性质。如果答案是肯定的,我该如何解决这个问题?
桃花长相依
相关分类