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

网站后台文字编辑器seo推广专员

网站后台文字编辑器,seo推广专员,昆明c2c网站建设,dw做公司网站这里写自定义目录标题 1. 为什么用CompletableFuture2. CompletionStage3. 核心四个静态方法3.1 使用 runAsync 和 supplyAsync 创建子任务 4. 设置的子任务回调钩子4.1 whenComplete4.2 whenCompleteAsync4.3 whenCompleteAsync4.4 exceptionally(Function<Throwable, ? e…

这里写自定义目录标题

  • 1. 为什么用CompletableFuture
  • 2. CompletionStage
  • 3. 核心四个静态方法
    • 3.1 使用 runAsync 和 supplyAsync 创建子任务
  • 4. 设置的子任务回调钩子
    • 4.1 whenComplete
    • 4.2 whenCompleteAsync
    • 4.3 whenCompleteAsync
    • 4.4 exceptionally(Function<Throwable, ? extends T> fn)
    • 4.5 总结对比

1. 为什么用CompletableFuture

get()方法在Future计算完成之前会一直处在阻塞状态下,isDone()方法容易耗费CPU资源,对于真正的一步处理我们希望是可以通过传入回调函数,在Future结束时自动调用该回调函数,这样我们就不需要等待结果。

阻塞的方式和异步编程的设计理念相维度,而轮询的方式会耗费无谓的CPU资源,因此JDK8推出了CompletableFuture。

CompletableFuture提供了一种观察者模式类似的机制,可以让任务执行完成之后通知监听的一方。

2. CompletionStage

public class CompletableFuture<T> implements Future<T>, CompletionStage<T> 

在这里插入图片描述
CompletionStage 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会进入另外一个阶段。一个阶段可以理解为一个子任务,每一个子任务会包装一个 Java 函数式接口实例,表示该子任务所要执行的动作。

每个 CompletionStage 子任务所包装的可以是一个 Function、Consumer 或者 Runnable 函数式
接口实例。这三个常用的函数式接口的特点为:
(1)Function
Function 接口的唯一方法点是:有输入、有输出。包装了 Funtion 实例的 CompletionStage 子
任务需要一个输入参数,并会产生一个输出结果到下一步。
(2)Runnable
Runnable 接口的唯一方法点是:无输入、无输出。包装了 Runnable 实例的 CompletionStage
子任务既不需要任何输入参数,也不会产生任何输出。
(3)Consumer
Consumer 接口的唯一方法点是:有输入、无输出。包装了 Consumer 实例的 CompletionStage
子任务需要一个输入参数,但不会产生任何输出。

多个 CompletionStage 构成了一条任务流水线,一个环节执行完成了将结果可以移交给下一
个环节(子任务)。多个 CompletionStage 子任务之间可以使用链式调用,下面是一个简单的例子:

oneStage.thenApply(x -> square(x)) .thenAccept(y -> System.out.println(y)).thenRun(() -> System.out.println())

对以上例子中的 CompletionStage 子任务说明如下:
(1)oneStage 是一个 CompletionStage 子任务,这是一个前提。
(2)x -> square(x)是一个 Function 类型的 Lamda 表达式,被 thenApply 方法包装成了一
个 CompletionStage 子任务,该子任务需要接收一个参数 x,然后会输出一个结果x 的平方值。
(3)y -> System.out.println(y)是一个 Comsumer 类型的 Lamda 表达式,被 thenAccept 方
法包装成了一个 CompletionStage 子任务,该子任务需要消耗上一个 Stage(子任务)的输出值,
但是此 Stage 并没有输出。
(4)() -> System.out.println()是一个 Runnable 类型的 Lamda 表达式,被 thenRun 方法
包装成了一个 CompletionStage 子任务,既不消耗上一个 Stage 的输出,也不产生结果。
CompletionStage 代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另一个阶
段。虽然一个 Stage 可以触发其他 Stage,但是并不能保证后续 Stage 的执行顺序。

3. 核心四个静态方法

3.1 使用 runAsync 和 supplyAsync 创建子任务

CompletionStage 子任务的创建是通过 CompletableFuture 完成的。CompletableFuture 类提供了非常强大的 Future 的扩展功能,可以帮助我们简化异步编程的复杂性,并且提供了函数式编程的能力,可以通过回调的方式处理计算结果,也提供了转换和组合 CompletionStage 的方法。

CompletableFuture 定义了一组方法用于创建 CompletionStage 子任务(或者阶段性任务),基
础的方法如下:

// 子任务包装一个 Runnable 实例,并使用 ForkJoinPool.commonPool()线程池去执行
public static CompletableFuture<Void> runAsync(Runnable runnable)// 子任务包装一个 Runnable 实例,并使用指定的 executor 线程池去执行
public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)// 子任务包装一个 Supplier 实例,并使用 ForkJoinPool.commonPool()线程池去执行
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier)// 子任务包装一个 Supplier 实例,并使用指定的 executor 线程池去执行
public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor)

在这里插入图片描述

4. 设置的子任务回调钩子

可以为CompletionStage子任务设置特定的回调钩子,当的计算结果完成,或者抛出异常的时候,可以执行这些特定的回调钩子。

// 设置的子任务完成时的回调钩子
public CompletableFuture<T> whenComplete(BiConsumer<? super T,?super Throwable> action)// 设置的子任务完成时的回调钩子,可能不在同一线程执行
public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T,? super Throwable> action)// 设置的子任务完成时的回调钩子,提交给线程池executor执行
public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T,? super Throwable> action,Executor executor)// 设置的异常处理的回调钩子
public CompletableFuture<T> exceptionally(Function<Throwable,? extends T> fn)

4.1 whenComplete

当任务完成时(成功或失败都会回调),在当前线程或执行任务的线程上执行回调。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {return 10 / 2;
});future.whenComplete((result, throwable) -> {if (throwable != null) {System.out.println("任务发生异常:" + throwable.getMessage());} else {System.out.println("任务成功,结果是:" + result);}
});

4.2 whenCompleteAsync

同上,不过回调会在默认的 ForkJoinPool.commonPool() 线程池中异步执行。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {return 10 / 2;
});future.whenCompleteAsync((result, throwable) -> {if (throwable != null) {System.out.println("异步任务发生异常:" + throwable.getMessage());} else {System.out.println("异步任务成功,结果是:" + result);}
});

4.3 whenCompleteAsync

同样异步执行回调,但你可以指定一个线程池。

ExecutorService executor = Executors.newFixedThreadPool(2);CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {return 10 / 2;
});future.whenCompleteAsync((result, throwable) -> {if (throwable != null) {System.out.println("自定义线程池处理异常:" + throwable.getMessage());} else {System.out.println("自定义线程池处理结果:" + result);}
}, executor);executor.shutdown();

4.4 exceptionally(Function<Throwable, ? extends T> fn)

仅当任务发生异常时回调。你可以返回一个替代结果。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {return 10 / 0; // 会抛出 ArithmeticException
});future.exceptionally(ex -> {System.out.println("发生异常:" + ex.getMessage());return -1; // 返回默认值}).thenAccept(result -> {System.out.println("处理后的结果是:" + result);});

4.5 总结对比

在这里插入图片描述

如果你需要:

  • 只处理异常:用 exceptionally
  • 无论成功失败都要执行某些逻辑:用 whenComplete
  • 且要保证不阻塞主线程:用 whenCompleteAsync 并指定线程池更灵活

如需结合使用多个钩子,也可以链式调用,例如:

CompletableFuture.supplyAsync(() -> 10 / 0).whenComplete((res, ex) -> System.out.println("完成!")).exceptionally(ex -> {System.out.println("捕获异常:" + ex.getMessage());return 0;});
http://www.dtcms.com/wzjs/388606.html

相关文章:

  • 福州市住房和城乡建设委员会网站如何拿高权重网站外链进行互换?
  • 锦州微商网站制做手机百度问一问
  • 国外优秀ps网站电商网站建设
  • 广州谷歌seo网站排名seo教程
  • 关于申请网站建设经费的请示友链交易网
  • 临时网站怎么做网店推广运营
  • 室内设计软件免费下载评论优化
  • 厦门制作企业网站查权重网站
  • 宿迁网站建设费用网络营销推广的手段
  • 网站栏目策划方案公司关键词seo
  • 网上商城网站开发与建立的意义成人计算机速成培训班
  • 自制网站的动态图怎么做淘客推广怎么做
  • 做的好的个人网站知乎文山seo
  • 企业网站建设视频网站之家
  • 自己做网站 发布视频教程百度seo规则
  • 网站建设 软件开发万网域名注册查询
  • 培训网站建设平台结构优化是什么意思
  • 专业营销网站惠州网站关键词排名
  • 网站开发 毕业答辩ppt百度推广后台
  • 中英文网站是怎么做的百度刷搜索词
  • 私人网站建设成本电子商务网站建设流程
  • 小程序代理须知seo具体是什么
  • 手机移动网站开发泉州关键词优化软件
  • 顺德建设幼儿院报名网站外贸营销网站建设介绍
  • 教做宝宝辅食的网站关键词调价工具哪个好
  • 梅州做网站搜索引擎优化培训中心
  • 公司让我做网站如何网站关键词优化
  • wordpress快速仿站视频教程北京官网seo收费
  • 武汉哪家做营销型网站好2022最新国际新闻10条简短
  • 网易云音乐网站开发介绍网络媒体软文案例