当前位置: 首页 > 知识库问答 >
问题:

在哪个线程上执行在new CompletableFuture()上注册的回调?[副本]

邹慈
2023-03-14

我是完全期货的新手,并试图了解在使用构造函数(new CompletableFuture())构造的CompletableFuture上注册的回调在哪个线程上

例如:

CompletableFuture<String> future =
        CompletableFuture.supplyAsync(() -> {
            //...
        }, pool);
CompletableFuture<Integer> intFuture =
    future.thenApply(s -> s.length());

thenApply()中的转换已注册,并将在任务完成后立即在与任务相同的线程中执行。

CompletableFuture<String> future = new CompletableFuture();
CompletableFuture<Integer> intFuture =
    future.thenApply(s -> s.length());
future.complete("hello");

thenApply()中的转换被注册,任务完成后,将在哪个线程上使用future执行。完成(“你好”)?它是在主线程上执行还是在ForkJoinPool.commonPool()上执行?

共有1个答案

蒙奇
2023-03-14

只有异步方法由新线程执行,因此在您的情况下,应用由主线程执行

所有没有显式执行器参数的异步方法都使用ForkJoinPool执行。commonPool()(除非它不支持至少两个并行级别,在这种情况下,将创建一个新线程来运行每个任务)。

public class TestMain {

public static void main(String[] args) {

    CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
        System.out.println(Thread.currentThread().getName());
        return "hello";
    });
    CompletableFuture<Integer> intFuture = future.thenApply(s -> {
        System.out.println(Thread.currentThread().getName());
        return s.length();
    });

    CompletableFuture<Integer> intFuture2 = future.thenApply(s -> {
        System.out.println(Thread.currentThread().getName());
        return s.length();
        });
       future.complete("hello");

     }

 }

输出

ForkJoinPool.commonPool-worker-1
main
main
 类似资料:
  • 本文向大家介绍iOS 在主线程上执行,包括了iOS 在主线程上执行的使用技巧和注意事项,需要的朋友参考一下 示例 当异步执行任务时,通常需要确保在主线程上运行一段代码。例如,您可能要异步访问REST API,但将结果放在屏幕上的UILabel中。在更新UILabel之前,必须确保您的代码在主线程上运行: 每当您更新屏幕上的视图时,请始终确保您正在主线程上执行此操作,否则可能会发生未定义的行为。

  • 我正在调试一个有很多线程的应用程序。我的断点设置为挂起整个VM。 当一个线程碰到其中一个断点时,我想使用步骤结束。但是这似乎会恢复整个虚拟机,直到该步骤完成。 如果我能单步执行到达断点的单线程,那将非常有帮助。 在IntelliJ 11.1/Java 6中有什么方法可以做到这一点吗?(希望我没有漏掉什么明显的东西……)

  • 我正在搜索一个在运行时注册@RestController的解决方案。我目前正在向

  • 问题内容: 我的一项活动遇到了一个奇怪的问题。从拍照/录像回来时,我正在显示一个对话框,允许用户命名相机。用户按下“确定”后,我将使用所请求的文件名发送给主题,该主题将复制文件(并显示进度对话框)。 由于某种原因,即使我调用,总是在主线程上调用执行复制的函数。 更改呼叫以解决问题。我还是想知道为什么它不起作用… 问题答案: 并且是那里最混乱的运营商。前者确保订阅副作用在指定的调度程序(线程)上发生

  • 在阅读关于流的留档时,我遇到了以下句子: > 。。。试图从行为参数访问可变状态会给您带来错误的选择。。。如果您不同步对该状态的访问,您将面临数据竞争,因此您的代码将被破坏。。。[1] 如果行为参数确实有副作用。。。[没有]保证在同一个线程中执行同一流管道中“相同”元素上的不同操作。[2] 对于任何给定的元素,可以在库选择的任何时间和线程中执行该操作。[3] 这些句子没有区分顺序流和平行流。因此,我

  • 问题内容: 我对CompletableFuture方法有疑问: 事情是JavaDoc这么说的: 返回一个新的CompletionStage,当此阶段正常完成时,将使用该阶段的结果作为所提供函数的参数来执行该阶段。有关涵盖异常完成的规则​​,请参见CompletionStage文档。 那线程呢?这将在哪个线程中执行?如果将来由线程池完成怎么办? 问题答案: 文档中指定的策略可以帮助您更好地理解: 对