- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 CompletableFuture 的 supplyAsync() 中处理长时间运行的操作,并将结果放入 thenAccept()。有时 thenAccept() 在主线程上执行,但有时它在工作线程上运行。但我只想在主线程上运行 thenAccept() 操作。这是示例代码。
private void test() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
System.out.println("supplyAsync | I am running on : " + Thread.currentThread().getName());
return "Hello world";
}, executorService);
CompletableFuture<Void> cf3 = cf1.thenAccept(s -> {
System.out.print("thenAccept | I am running on : " + Thread.currentThread().getName());
System.out.println(" | answer : " + s);
});
cf3.thenRun(() -> {
System.out.println("thenRun | I am running on : " + Thread.currentThread().getName());
System.out.println();
});
}
public static void main(String[] args) {
App app = new App();
for(int i = 0; i < 3; i++){
app.test();
}
}
结果是:
supplyAsync | I am running on : pool-1-thread-1
thenAccept | I am running on : main | answer : Hello world
thenRun | I am running on : main
supplyAsync | I am running on : pool-2-thread-1
thenAccept | I am running on : main | answer : Hello world
thenRun | I am running on : main
supplyAsync | I am running on : pool-3-thread-1
thenAccept | I am running on : pool-3-thread-1 | answer : Hello world
thenRun | I am running on : pool-3-thread-1
我该如何解决这个问题?
最佳答案
查看 CompletableFuture 的 JavaDoc .有趣的部分是关于 CompletionStage 政策的部分。
您会发现使用非异步 方法会导致一种非此即彼的情况。如果您随后查看实现,您将最终进入 Java 运行时的非公共(public)部分。有一些 UNSAFE 处理意味着可能会发生某种竞争条件。
我建议使用 thenAcceptAsync() 和 thenRunAsync() 变体并将您的 executorService 变量传递给这两个调用。
关于java - 为什么 CompletableFuture 的 thenAccept() 没有在主线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36981432/
我想调用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
我是一名优秀的程序员,十分优秀!