首页 > 软件编程 > java > Java CompletableFuture

详解Java CompletableFuture使用方法以及与FutureTask的区别

作者:一月三千五

CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调、流式处理、多个Future组合处理的能力,使Java在处理多任务的协同工作时更加顺畅便利

总的来说简洁了FutureTask与线程池的配合使用

没啥太大区别吧我觉得, 使用方法不一样, 多了一些方法 ???

futureTask 创建异步任务

FutureTask<String> stringFutureTask = new FutureTask<>(() -> { return "aa"; executorService.execute(stringFutureTask); System.out.println(stringFutureTask.get()); CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { return "aa"; }, executorService); // 不用手动提交了 System.out.println(future1.get());

还有很多异步回调, 组合处理

1. .supplyAsync

创建一个带返回值的任务

2. .runAsync

创建一个不带返回值的任务

ExecutorService executorService = Executors.newFixedThreadPool(1); // 带返回值 CompletableFuture future = CompletableFuture.supplyAsync(() -> { try { System.out.println("future " + new Date()); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); return "aaa"; }, executorService); // 推荐使用

以上两个方法都有两个构造方法, 默认不指定自定义线程池, 他会指定默认的提交任务的方法

// 查看cpu的核数是否大于1核 private static final boolean useCommonPool = (ForkJoinPool.getCommonPoolParallelism() > 1); // 如果大于1核 则调用execute方法, 每次创建一个线程 private static final Executor asyncPool = useCommonPool ? ForkJoinPool.commonPool() : new ThreadPerTaskExecutor(); static final class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); }

所以推荐自定义线程池的方式

指的是 异步任务结束后调用的任务

1. .thenApply

带返回值的异步调用函数, 有入参, 有出参

2. .thenAccept

不带返回值的异步回调函数, 有入参

CompletableFuture future = CompletableFuture.supplyAsync(() -> { try { System.out.println("future " + new Date()); Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); return "aaa"; }, executorService); // future执行完之后执行的异步任务 CompletableFuture<String> thenApply = future.thenApply((result) -> { System.out.println("future2 " +new Date()); System.out.println(result); return "bbb" + result;

3. .exceptionally

异步任务出现异常调用的回调方法

CompletableFuture future = CompletableFuture.supplyAsync(() -> { try { System.out.println("future " + new Date()); Thread.sleep(2000); int a = 1 / 0; } catch (InterruptedException e) { e.printStackTrace(); return "aaa"; }, executorService); CompletableFuture<String> exceptionally = future.exceptionally((result) -> { System.out.println("future3 " + result); return "bbb" + result; // 出现异常则返回异常, 没异常则返回future的返回值 System.out.println(exceptionally.get());

4. .whenComplete

当主任务出现异常时, 会终止任务,get的时候会抛出主任务的异常, 入参值为null, 否则正常运行

CompletableFuture future = CompletableFuture.supplyAsync(() -> { try { System.out.println("future " + new Date()); Thread.sleep(2000); int a = 1/0; } catch (InterruptedException e) { e.printStackTrace(); return "aaa"; }, executorService); CompletableFuture<String> exceptionally = future.whenComplete((result, error) -> { System.out.println("future3 " + result); System.out.println("future3 " + error); System.out.println(exceptionally.get());

就是将多个任务组合起来执行, 时间原因, 这里我就不介绍了, 大家另行百度吧

到此这篇关于详解Java CompletableFuture使用方法的文章就介绍到这了,更多相关Java CompletableFuture内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • java:提示程序包org.junit不存在时的解决方案
    java:提示程序包org.junit不存在时的解决方案
    2023-11-11
  • java List.of()与Arrays.asList()方法对比分析
    java List.of()与Arrays.asList()方法对比分析
    2023-11-11
  • springboot mybatis-plus实现登录接口
    springboot mybatis-plus实现登录接口
    2023-11-11
  • 关于TransmittableThreadLocal线程池中线程复用问题的解决方案
    关于TransmittableThreadLocal线程池中线程复用问题的解决方案
    2023-11-11
  • 关于TransmittableThreadLocal线程池中线程复用问题的解决方案
    关于TransmittableThreadLocal线程池中线程复用问题的解
    2023-11-11
  • XML Web 服务 Eclipse实现sun-jaxws.xml文件的方法
    XML Web 服务 Eclipse实现sun
    2023-11-11
  • 使用Java实现一个能保留计算过程的计算器
    使用Java实现一个能保留计算过程的计算器
    2023-11-11
  • 巧用FutureTask 线程池轻松解决接口超时问题
    巧用FutureTask 线程池轻松解决接口超时问题
    2023-11-11
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2024 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号