【发布时间】:2021-04-12 18:38:33
【问题描述】:
我在学习CompletableFuture 时遇到了一个问题。 get()/join() 方法是阻塞调用。如果我不打电话给他们怎么办?
此代码调用get():
// Case 1 - Use get()
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1_000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Hello");
}).get();
System.out.println("World!");
Thread.sleep(5_000L); // Don't finish the main thread
输出:
Hello
World!
这段代码既不调用get()也不调用join():
// Case 2 - Don't use get()
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1_000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Hello");
});
System.out.println("World!");
Thread.sleep(5_000L); // For don't finish main thread
输出:
World!
Hello
我不知道为什么案例 2 的可运行块正在工作。
【问题讨论】:
-
为什么不希望它运行?
-
@LouisWasserman 我了解到的材料中没有任何内容是我没有写下来的。所以我预计它不会起作用。类似于 Stream Api 的终端操作。
-
@LouisWasserman 像 Reactive Streams 这样的设计很常见,对于初学者来说,“推”和“拉”方法之间的区别并不总是很明显。
-
好问题。 “拉动”行为的其他示例:在 Python 中,生成器在执行之前实际上不会做任何事情。如果您创建了一个生成器但不运行它,则不会发生任何事情。 Rust 中的期货也是如此。它们仅在您
.await他们时运行。 -
@chrylis-cautiouslyoptimistic- 没错。我不明白“拉”和“推”的方法。让我们了解一下这两个概念。谢谢。
标签: java multithreading completable-future