• 请不要在回答技术问题时复制粘贴 AI 生成的内容
movq
V2EX  ›  程序员

Java 的 CompletableFuture API 日常开发中使用得多么,怎么感觉这个 API 很怪

  •  
  •   movq · 1 day ago · 1105 views

    我是 Java 程序员,但我也知道 JS 里面有个Promise,感觉Promise的语法比 Java 的CompletableFuture这套 API 优雅很多。Promise总共也需要知道then,catch两种语句,而CompletableFuture则各种方法都有十几二十个了。

    还有些匪夷所思的行为,比如下面这个:

    同步编排(无 Async 后缀)的方法,例如thenCompose不会把任务重新提交给线程池排队,而是尽量复用现有的线程。具体用哪个线程,取决于代码运行时的时机

    情况 A (前置任务还没执行完): 当你调用 thenCompose 时,如果前置任务还在跑,那么 thenCompose 里的代码会在前置任务所在的线程中接着运行。

    情况 B (前置任务已经执行完了): 当你调用 thenCompose 时,如果前置任务早就跑完了,那么 thenCompose 里的代码会在当前调用代码的主线程( Caller Thread )中立刻运行。

    CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
        // 假设在 ForkJoinPool-1 线程执行
        return "Hello"; 
    });
    
    // 因为没有 Async ,它会尝试复用线程
    future1.thenCompose(result -> {
        // 如果 future1 刚执行完,这里大概率还是在 ForkJoinPool-1 线程执行
        // 如果 future1 早就执行完了,这里会在 Main 线程执行
        return CompletableFuture.supplyAsync(() -> result + " World"); 
    });
    

    那程序员调这个方法的时候,相当于遇到不确定性行为(nondeterministic behavior)了。我都不知道我要调的方法到底是在哪个线程执行,会不会把当前线程卡住

    3 replies    2026-06-19 23:30:02 +08:00
    e3c78a97e0f8
        1
    e3c78a97e0f8  
       1 day ago via iPhone
    我们公司压根 不准用 CompletableFuture. 以前用 ListenableFuture ,然而这个坑有很多,又发明了各种框架,再然后推荐用 Kotlin 协程。现在在实验 virtual thread ,但是还没大规模用。
    antipro
        2
    antipro  
       23h 35m ago via Android
    Java 本身就啰嗦一些,再加上要和多线程扯一起,自然会比较复杂
    Lighfer
        3
    Lighfer  
       15h 22m ago
    用,工作流引擎,各种并行分支、并行执行,不用的话线程数的爆炸
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2486 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:52 · PVG 14:52 · LAX 23:52 · JFK 02:52
    ♥ Do have faith in what you're doing.