当前位置: 首页 > article >正文

理解CompletableFuture的非阻塞

非阻塞是指程序在执行某个操作时,不会因为等待该操作完成而停止执行后续代码,而是可以继续处理其他任务。在 Java 并发编程中,CompletableFuture 通过回调机制和异步执行实现了非阻塞的特性。以下是具体体现非阻塞的方式:


1. 回调机制

CompletableFuture 提供了丰富的回调方法(如 thenApplythenAcceptthenRun 等),可以在任务完成后自动触发回调函数,而无需阻塞主线程等待任务完成。

示例:
CompletableFuture.supplyAsync(() -> {
    // 模拟耗时任务
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Hello";
}).thenAccept(result -> {
    // 非阻塞处理结果
    System.out.println("Result: " + result);
});

System.out.println("Main thread continues to run...");

输出

Main thread continues to run...
Result: Hello

说明

  • supplyAsync 启动了一个异步任务。
  • thenAccept 注册了一个回调函数,在任务完成后自动执行。
  • 主线程不会阻塞,而是继续执行后续代码(打印 "Main thread continues to run...")。

2. 异步执行

CompletableFuture 的任务默认在 ForkJoinPool 或指定的线程池中异步执行,主线程不会被阻塞。

示例:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 模拟耗时任务
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Async Task Completed";
});

System.out.println("Main thread is not blocked.");

输出

Main thread is not blocked.

说明

  • 异步任务在后台线程中执行,主线程不会被阻塞,可以继续执行其他代码。

3. 组合多个异步任务

CompletableFuture 支持将多个异步任务组合在一起,任务之间可以并行执行,主线程不会被阻塞。

示例:
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Task 1";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "Task 2";
});

CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2);
combinedFuture.thenRun(() -> {
    System.out.println("All tasks completed.");
});

System.out.println("Main thread continues to run...");

输出

Main thread continues to run...
All tasks completed.

说明

  • future1future2 并行执行,主线程不会被阻塞。
  • thenRun 在所有任务完成后触发回调。

4. 异常处理的非阻塞

CompletableFuture 提供了 exceptionallyhandle 等方法,可以在任务发生异常时非阻塞地处理异常。

示例:
CompletableFuture.supplyAsync(() -> {
    if (true) {
        throw new RuntimeException("Task failed!");
    }
    return "Success";
}).exceptionally(ex -> {
    System.out.println("Exception: " + ex.getMessage());
    return "Fallback Result";
}).thenAccept(result -> {
    System.out.println("Final Result: " + result);
});

System.out.println("Main thread continues to run...");

输出

Main thread continues to run...
Exception: Task failed!
Final Result: Fallback Result

说明

  • 任务抛出异常后,exceptionally 非阻塞地处理异常并返回备用结果。
  • 主线程不会被阻塞,继续执行后续代码。

总结

CompletableFuture 通过以下方式体现非阻塞:

  1. 回调机制:任务完成后自动触发回调,无需阻塞主线程。
  2. 异步执行:任务在后台线程中执行,主线程可以继续运行。
  3. 任务组合:多个任务可以并行执行,主线程不会被阻塞。
  4. 异常处理:异常发生时,非阻塞地处理异常并返回备用结果。

这些特性使得 CompletableFuture 成为处理异步任务的强大工具,能够显著提升程序的并发性能和响应速度。


http://www.kler.cn/a/560368.html

相关文章:

  • springboot005学生心理咨询评估系统(源码+数据库+文档)
  • 使用Vue-Flow创建一个流程图可视化节点坐标查询器
  • 【算法】位运算
  • 4. Spring Cloud Gateway 入门与使用
  • 牛客周赛 Round 82(思维、差分、树状数组、大根堆、前后缀、递归)
  • JavaWeb基础专项复习4——会话对象Session and Cookie
  • 【深度学习】Java DL4J 基于MLP构建农业数据分析模型
  • 软件需求管理办法,软件开发管理指南(Word原件)
  • 纯电动轻型载货车能量流测试优化研究
  • 鸿蒙开发深入浅出04(首页数据渲染、搜索、Stack样式堆叠、Grid布局、shadow阴影)
  • 网络安全漏洞管理要求 网络安全产品漏洞
  • Day54(补)【AI思考】-SOA,Web服务以及无状态分步解析与示例说明
  • pyecharts介绍
  • 使用Windbg调试目标进程排查C++软件异常的一般步骤与要点分享
  • DeepSeek 助力 Vue 开发:打造丝滑的文本输入框(Text Input)
  • 自然语言处理中的检索增强生成研究综述
  • NVIDIA H 系列 GPU与deepseek开源FlashMLA
  • 【CSS】HTML元素布局基础总结
  • c#丰田PLC ToyoPuc TCP协议快速读写 to c# Toyota PLC ToyoPuc读写
  • 分布式简单理解