博客
关于我
使用CompletableFuture.supplyAsync实现异步操作
阅读量:798 次
发布时间:2023-04-02

本文共 2259 字,大约阅读时间需要 7 分钟。

使用CompletableFuture实现异步操作:复杂型与简洁型对比分析

1. 复杂型代码示例

public static void useCompletableFuture_complicated() {    ExecutorService executor = Executors.newFixedThreadPool(2);    List
personNameList = new ArrayList<>(); for (int i = 0; i < 1000; i++) { personNameList.add(String.valueOf(i)); } for (String personName : personNameList) { CompletableFuture.supplyAsync(new Supplier
() { @Override public String get() { System.out.println(personName + ": Hello World!"); return "task finished!"; } }, executor).exceptionally(e -> { System.out.println("异常处理:" + e.getMessage()); return "error"; }); } executor.shutdown(); while (!executor.isTerminated()) { System.out.println("线程池未终止"); try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { System.out.println("主线程被打断:" + e.getMessage()); e.printStackTrace(); } }}

2. 简洁型代码示例

public static void useCompletableFuture_simple() {    ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100), new OwlThreadFactory("ThreadPool"));    List
nameList = new ArrayList<>(); for (int i = 0; i < 1000; i++) { nameList.add(String.valueOf(i)); } nameList.forEach(name -> CompletableFuture.supplyAsync(() -> { System.out.println(Thread.currentThread().getName() + ", name=" + name); return "success"; }, executor).exceptionally(e -> { System.out.println("异常处理:" + e.getMessage()); return "error"; })); // 由于ThreadPoolExecutor是公用线程池,不能直接关闭,需谨慎管理}

3. 线程池与线程工厂优化说明

3.1 自定义线程池参数

  • 核心线程数:5
  • 最大线程数:10
  • 队列容量:100
  • 线程存活时间:1秒
  • 线程工厂:自定义工厂,支持命名

3.2 线程工厂功能

  • 线程命名规则From OwlThreadFactory's [特征名称]-Worker-[线程ID]
  • 线程ID管理:使用原子整数生成唯一ID

4. 注意事项

  • 线程池安全使用

    • 使用shutdown()关闭线程池时,不会打断已提交的任务。
    • 使用isTerminated()检查线程池状态,需在shutdown()后等待所有任务完成。
  • 默认线程池风险

    • Java的Executors.newFixedThreadPool()默认使用无界队列,可能导致内存泄漏。
    • 建议使用自定义线程池,避免潜在风险。
  • 异步操作特点

    • 异步操作通常不关心执行结果,即使不等待任务完成,主线程仍能继续运行。
    • 使用CompletableFuture.supplyAsync()适用于非阻塞任务,适合处理大量耗时操作。
  • 5. 总结

    两种实现方式在功能上一致,简洁型代码更依赖JDK特性,复杂型代码提供更低层次的操作控制。选择哪种方式取决于具体需求,建议根据项目规模选择合适的线程池策略,并注意线程池的安全管理。

    转载地址:http://gmefk.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>
    OSG学习:纹理映射(一)——多重纹理映射
    查看>>
    OSG学习:纹理映射(七)——聚光灯
    查看>>
    OSG学习:纹理映射(三)——立方图纹理映射
    查看>>
    OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
    查看>>
    OSG学习:纹理映射(五)——计算纹理坐标
    查看>>
    OSG学习:纹理映射(六)——灯光
    查看>>
    OSG学习:纹理映射(四)——三维纹理映射
    查看>>
    OSG:从源码看Viewer::run() 一
    查看>>
    osi 负载均衡
    查看>>
    OSI七层模型与TCP/IP五层模型(转)
    查看>>
    OSI七层模型与TCP/IP四层与五层模型详解
    查看>>
    OSI七层模型的TCP/IP模型都有哪几层和他们的对应关系?
    查看>>
    OSI操作系统(NETBASE第八课)
    查看>>