CompletableFuture主要功能介绍

lz 1年前 ⋅ 1452 阅读

CompletableFuture是什么

  • 简单的任务,用Future获取结果还好,但我们并行提交的多个异步任务,往往并不是独立的,很多时候业务逻辑处理存在串行[依赖]、并行、聚合的关系。
  • CompletableFuture是Future接口的扩展和增强。
  • CompletableFuture实现了对任务的编排能力。
  • 虽然通过CountDownLatch等工具类也可以实现任务的编排,但需要复杂的逻辑处理,不仅耗费精力且难以维护。

CompletableFuture的主要功能介绍

  • 描述依赖关系:
  • thenApply:把前面异步任务的结果,交给后面的Function
  • thenCompose:用来连接两个有依赖关系的任务,结果由第二个任务返回
  • 描述and聚合关系:
  • thenCombine:任务合并,有返回值
  • thenAccepetBoth:两个任务执行完成后,将结果交给thenAccepetBoth消耗,无返回值。
  • runAfterBoth:两个任务都执行完成后,执行下一步操作(Runnable)。
  • 描述or聚合关系:
  • applyToEither:两个任务谁执行的快,就使用那一个结果,有返回值。
  • acceptEither: 两个任务谁执行的快,就消耗那一个结果,无返回值。
  • runAfterEither: 任意一个任务执行完成,进行下一步操作(Runnable)。
  • 并行执行:
  • CompletableFuture类自己也提供了anyOf()和allOf()用于支持多个CompletableFuture并行执行
  • 获取结果
  • join:无异常抛出
  • get:抛出的是经过检查的异常,ExecutionException, InterruptedException
  • 结果处理
  • whenComplete:正常的结果处理
  • exceptionally:异常的结果处理
  • whenCompleteAsync:正常的结果处理,开启新线程
  • 结果转换
  • thenApply:使用一阶段的结果用在二阶段,返回一个具有处理结果的Future对象。
  • thenCompose:使用一阶段的结果用在二阶段,返回 CompletableFuture 实例的函数,该函数的参数是先前计算步骤的结果。
  • 结果消费
  • thenAccept系列:对单个结果进行消费
  • thenAcceptBoth系列:对两个结果进行消费
  • thenRun系列:不关心结果,只对结果执行Action
  • 结果组合
  • thenCombine:合并两个线程任务的结果,并进一步处理。
  • 任务交互
  • applyToEither:两个线程任务相比较,先获得执行结果的,就对该结果进行下一步的转化操作。返回CompletionStage<U>。
  • acceptEither:两个线程任务相比较,先获得执行结果的,就对该结果进行下一步的消费操作。返回CompletionStage<Void>。
  • runAfterEither:两个线程任务相比较,有任何一个执行完成,就进行下一步操作,不关心运行结果。返回CompletionStage<Void>。
  • runAfterBoth:两个线程任务相比较,两个全部执行完成,才进行下一步操作,不关心运行结果。返回CompletionStage<Void>。
  • anyOf:方法的参数是多个给定的 CompletableFuture,当其中的任何一个完成时,方法返回这个 CompletableFuture。
  • allOf:方法用来实现多 CompletableFuture 的同时返回。

CompletableFuture的使用方式

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureTest {

	public static void main(String[] args) throws ExecutionException, InterruptedException {

		// 执行无返回结果的异步任务
		CompletableFuture.runAsync(() -> System.out.println("执行无返回结果的异步任务"));

		// 执行有返回值的异步任务
		CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
		    System.out.println("执行有返回值的异步任务");
		    try {
		        Thread.sleep(5000);
		    } catch (InterruptedException e) {
		        e.printStackTrace();
		    }
		    return "Hello World";
		});
		// 打印有返回值异步任务的返回值
		System.out.println(future.get());
	}
}

 

--end--

 

版权 本着开源共享、共同学习的精神,本文转载自 https://blog.csdn.net/qq_35436158/article/details/123038237 , 如果侵权之处,请联系博主进行删除,谢谢~