- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想调用 CompletableFuture.supplyAsync()
将阻塞任务委托(delegate)给另一个线程。一旦该任务完成,我希望 CompletableFuture.thenAccept
消费者在调用线程的上下文中运行。
例如:
// Thread 1
CompletableFuture.supplyAsync(() -> {
// Thread 2
return BlockingMethod();
}).thenAccept((
Object r) -> {
// Thread 1
});
下面的代码表明CompletableFuture.thenAccept
在它自己的线程中运行;可能与 CompletableFuture.supplyAsync
相同的池,因为我在运行它时获得相同的线程 ID:
System.out.println("Sync thread supply " + Thread.currentThread().getId());
CompletableFuture.supplyAsync(() -> {
System.out.println("Async thread " + Thread.currentThread().getId());
try {
Thread.sleep(2000);
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}).thenAccept((
Boolean r) -> {
System.out.println("Sync thread consume " + Thread.currentThread().getId());
});
Thread.sleep(3000);
是否可以让 CompletableFuture.thenAccept
与调用线程同时运行?
最佳答案
CompletableFuture
只会执行你在 thenAccept
注册的 Consumer
当接收者 CompletableFuture
(一个返回supplyAsync
) 已完成,因为它需要完成时使用的值。
如果调用thenAccept
时接收方CompletableFuture
已完成,则Consumer
将在调用线程中执行。否则,它将在完成提交给 supplyAsync
的 Supplier
的任何线程上执行。
Is it possible to have
CompletableFuture.thenAccept
run concurrently with the calling thread?
这是一个令人困惑的问题,因为一个线程一次只能运行一件事。单个线程没有并发。 Concurrently 是一个跨越多个线程的属性。
如果您希望 Consumer
在调用 thenAccept
的同一线程上运行,则在 CompletableFuture
上join
>,阻塞这个线程直到 future 完成。然后您可以自己执行 Consumer
或调用 thenAccept
为您执行它。
例如
CompletableFuture<Boolean> receiver = CompletableFuture.supplyAsync(() -> {
System.out.println("Async thread " + Thread.currentThread().getId());
try {
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
return true;
});
receiver.join();
Consumer<Boolean> consumer = (Boolean r) -> {
System.out.println("Sync thread consume " + Thread.currentThread().getId());
};
consumer.accept(receiver.get());
(省略异常处理。)
如果您希望 Consumer
与提供给 supplyAsync
的 Supplier
并行运行,这是不可能的。 Consumer
旨在消费 Supplier
产生的值(value)。在 Supplier
完成之前,该值不可用。
关于java - 从调用线程运行 CompletableFuture.thenAccept?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928012/
我想调用CompletableFuture.supplyAsync()将阻塞任务委托(delegate)给另一个线程。一旦该任务完成,我希望 CompletableFuture.thenAccept
我想调用 CompletableFuture.supplyAsync() 将阻塞任务委托(delegate)给另一个线程。一旦该任务完成,我希望 CompletableFuture.thenAccep
我正在尝试从使用 CompletableFuture 的方法执行异步调用.完成该任务后,我尝试打印对象 DummyObject 的值,这些值对于调用异步调用的方法是本地的。 我想知道它是如何工作的?线
与某些博客中所述(例如 I can't emphasize this enough: thenAccept()/thenRun() methods do not block )不同,Completab
我正在做一个有很多 CompletableFuture.completedFuture ... thenAccept 代码的项目,例如 public CompletableFuture cal
我正在开发一个与其他网络应用程序通信的网络应用程序。有时,我的系统会向其他系统发送 HTTP 请求作为通知。由于他们的响应对我来说不是必需的,我使用 Java 8 CompletableFuture
我正在尝试从我的 CompletableFuture 中返回一个列表,如下所示: public List get() { CompletableFuture> providersRespons
我正在阅读关于 CompletableFuture 的文档,thenAccept() 的描述是 Returns a new CompletionStage that, when this stage
所以我有一个返回 CompletableFuture 的方法。在返回之前,此方法添加一个带有 thenAccept 的 block ,该 block 在 CompletableFuture 完成后执行
我在 CompletableFuture 的 supplyAsync() 中处理长时间运行的操作,并将结果放入 thenAccept()。有时 thenAccept() 在主线程上执行,但有时它在工作
如何在单元测试中避免手动休眠。假设在下面的代码中,Process 和 notify 处理大约需要 5 秒。所以为了完成处理,我增加了 5 秒的 sleep 时间。 public class Class
如何在单元测试中避免手动休眠。假设在下面的代码中,Process 和 notify 处理大约需要 5 秒。所以为了完成处理,我增加了 5 秒的 sleep 时间。 public class Class
我是一名优秀的程序员,十分优秀!