>Java >java지도 시간 >비동기 프로그래밍을 위해 Java에서 CompletableFuture 함수를 사용하는 방법

비동기 프로그래밍을 위해 Java에서 CompletableFuture 함수를 사용하는 방법

王林
王林원래의
2023-06-26 16:09:36958검색

현대 컴퓨터 시스템이 점점 복잡해지고 규모가 커지면서 동시성 성능은 실제 문제를 해결하는 데 필요한 도구가 되었습니다. 전통적인 동기 프로그래밍 방법은 더 이상 복잡한 시스템의 요구를 충족할 수 없습니다. 비동기 프로그래밍은 현대 프로그래머가 고성능 프로그램을 개발하는 데 중요한 도구가 되었습니다. Java 8에 도입된 CompletableFuture는 비동기 프로그래밍을 위한 강력한 메커니즘으로, 비동기 프로그래밍의 복잡성을 크게 단순화하고 코드의 가독성과 유지 관리성을 향상시킬 수 있습니다. 이 기사에서는 CompletableFuture의 기본 개념, 비동기 작업 구축 및 사용, 비동기 작업 결과 처리 방법을 자세히 설명합니다.

CompletableFuture 개요

CompletableFuture는 Future 인터페이스를 구현한 클래스로, 비동기 연산을 표현하고 연산 결과를 처리하기 위해 Java 8에서 제공하는 새로운 비동기 프로그래밍 도구입니다. Future 인터페이스와 달리 CompletableFuture는 비동기 작업의 결과를 더 잘 표현할 수 있는 보다 강력한 도구를 제공합니다. CompletableFuture 클래스는 RxJava 프레임워크의 Observable 및 Android의 AsyncTask와 유사하게 스트리밍 비동기 작업 체인을 형성하기 위해 여러 비동기 작업을 연결하는 것을 지원합니다.

CompletableFuture를 사용하면 개발자는 많은 스레딩 및 잠금 세부 사항을 고려할 필요 없이 비동기 프로그래밍 논리를 쉽게 구축할 수 있습니다. CompletableFuture의 사용도 매우 간단하고 명확합니다. 이는 비동기 프로그래밍이 구현되는 방식을 변경하고 콜백 기반 비동기 프로그래밍의 결함을 줄이고 코드 가독성과 유지 관리성을 향상시킵니다.

기본 사용법

CompletableFuture의 기본 사용법은 비동기 작업 체인을 구축하는 것입니다. thenApplyAsync, thenComposeAsync, thenCombineAsync 및 thenAcceptAsync 메서드를 사용하여 비동기 작업을 함께 연결할 수 있습니다. thenApplyAsync 메서드는 새로운 비동기 작업을 생성하기 위해 다른 비동기 결과에 펑터(함수)를 적용하는 데 사용됩니다. thenComposeAsync 메서드는 비동기 작업의 결과를 다른 비동기 작업에 매핑하고 연결하는 데 사용됩니다. thenCombineAsync 메서드는 결합에 사용됩니다. 두 개의 비동기 작업의 결과를 가져와서 새 비동기 작업을 생성합니다. thenAcceptAsync 메서드는 비동기 결과를 사용하는 데 사용됩니다.

다음은 기본 비동기 프로그래밍 패턴을 보여주는 간단한 예입니다.

// 异步执行任务1
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");

// 异步执行任务2,并在任务1完成之后执行
CompletableFuture<String> future2 = future1.thenApplyAsync(result -> result + " World");

// 等待任务2执行完成,并处理结果
future2.thenAcceptAsync(result -> System.out.println(result));

이 코드는 CompletableFuture를 사용하여 간단하고 강력한 비동기 프로그래밍 모델을 구축하여 비동기 작업 체인을 형성하는 방법을 보여줍니다. 먼저, SupplyAsync 메서드를 사용하여 작업 1을 비동기적으로 실행합니다. 이 메서드는 동기 작업을 비동기 작업으로 변환합니다. 그런 다음 thenApplyAsync 메서드를 사용하여 작업 1의 결과("Hello")를 "World" 문자열과 연결하고 결과 맵을 나타내는 새 문자열 개체를 만듭니다. 마지막으로 thenAcceptAsync 메서드를 사용하여 결과를 처리하고 인쇄합니다. 이 예제는 매우 간단하지만 CompletableFuture의 기본 기능, 특히 체인 프로그래밍 및 비동기 프로그래밍 기능을 보여줍니다.

비동기 작업의 세 가지 상태

CompletableFuture에는 다음과 같은 세 가지 상태가 있습니다.

  • Uncompleted: CompletableFuture가 아직 관련 결과를 설정하지 않았습니다. 예를 들어 비동기 작업 실행이 시작되지 않았거나, 비동기 작업이 진행 중이거나, 비동기 작업이 실행되었지만 완료되지 않았습니다.
  • 예외적으로 완료: CompletableFuture에서 런타임 중에 예외가 발생하여 작업이 완료되지 않았습니다. 예외 유형은 CompleteExceptionally 메소드를 호출하여 설정된 예외 유형에 따라 결정됩니다.
  • Completed (정상적으로 완료됨): CompletableFuture가 완료되어 결과가 성공적으로 반환되었습니다. 결과 유형은 Complete 또는 CompleteAsync 메서드를 호출하여 전달된 매개 변수 유형에 따라 결정됩니다.

모든 CompletableFuture 객체에는 완료 또는 예외 상태가 하나만 있으며 완료되지 않은 상태에서 최종 상태로 전환됩니다. isDone 메소드를 사용하여 CompletableFuture가 완료되었는지 확인할 수 있습니다. 예: future.isDone().

CompletableFuture의 메서드를 더 자세히 살펴보세요

CompletableFuture는 비동기 작업의 실행을 지연하고 그 결과를 처리하는 다양한 메서드를 제공합니다. 주요 CompletableFuture 메서드 중 일부는 다음과 같습니다.

  • Runnable 包装器:runAsync 和 supplyAsync 是 CompletableFuture 运行异步任务的最简单的方式。
  • 转换函数:我们可以通过使用 thenApply 方法来将一个异步操作的结果转化为另一个异步操作的参数。这也被称为异步映射。同样,使用 thenAccept 方法将一个异步结果作为消耗者。
  • Bi Function:thenCombine 方法将两个 CompletableFuture 对象组合在一起,同时为它们提供一个组合函数。
  • 异常处理:当 Future 对象抛出异常时,我们可以使用 exceptionally 方法指定如何处理异常。另外,使用 handle 方法还可以处理正常的结果和异常的情况。
  • 组合多个结果:使用 allOf 和 anyOf 方法处理多个异步操作的结果。其中 allOf 则等待所有异步操作完成,而 anyOf 仅需等待其中任意一个异步操作完成。

案例演示

我们来看一个更加复杂的例子,该例子将涉及到 CompletableFuture 的多种使用模式:

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

public class CompletableFutureDemo {

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

      // 创建异步任务1
      CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 2 + 3);

      // 创建异步任务2
      CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 3 * 4);

      // 组合异步任务1和异步任务2,使用BiFunction对象作为组合函数
      CompletableFuture<Integer> future3 = future1.thenCombineAsync(future2, (result1, result2) -> result1 * result2);

      // 创建异步任务3
      CompletableFuture<Integer> future4 = CompletableFuture.supplyAsync(() -> 2 + 7);

      // 组合异步任务1和异步任务3,使用Function类型的函数
      CompletableFuture<Integer> future5 = future1.thenComposeAsync(result -> CompletableFuture.supplyAsync(() -> result + 5));

      // 组合异步任务1、异步任务2和异步任务3,使用组合函数,返回类型为Void
      CompletableFuture<Void> future6 = CompletableFuture.allOf(future1, future2, future4).thenAcceptAsync((Void) -> {
         try {
            System.out.println("The result of future1 is: " + future1.get());
            System.out.println("The result of future2 is: " + future2.get());
            System.out.println("The result of future4 is: " + future4.get());
         } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
         }
      });

      // 等待所有异步任务执行完毕
      CompletableFuture.allOf(future3, future5, future6).join();
   }
}

这段代码展示了 CompletableFutures 几种常用方法:suplyAsync、thenCombineAsync、thenComposeAsync和acceptAsync、allOf、isDone、join、get 和其他一些方法。我们首先定义了三个不同的 CompletableFuture 对象,根据不同的函数来完成,然后使用 thenCombineAsync 方法将这两个对象组合成一个对象。我们还使用 thenComposeAsync 构建了另一个异步结果,从这两个对象中获取了一些信息。最后,我们使用 allOf 方法来组合三个异步事件并在这三个异步操作完成后将它们组合在一个 Void 异步操作中,并使用 thenAcceptAsync 接受它们的值并将其打印到控制台上。

异步编程实践

异步编程是一项复杂的任务,有很多复杂性,需要更多的时间和经验来正确地完成。我们需要明确异步编程的目的,并准确掌握 CompletableFuture 机制,才能写出简洁、精简、易维护的代码。

异步编程的另一个好处是提高应用程序的性能和吞吐量,因为我们可以为多个 CPU 核心优化和并发运行任务。然而,它也有一定的成本,包括更复杂的代码、需要加锁的数据结构和其他潜在的性能问题。但是,使用 CompletableFuture 进行异步编程,可以使代码更具可读性和可维护性,并减少程序员编写出还原异步操作的代码的负担。异步编程虽然存在挑战,但对于开发高性能应用程序至关重要。

结论

这篇文章介绍了 CompletableFuture 和其在 Java 异步编程中的应用。CompletableFuture 类是一种强大的异步编程工具,可以帮助开发人员优雅地解决异步问题。虽然异步编程有一定的复杂性,但是通过理解 CompletableFuture 的基础和高级特性,我们可以优化代码并提高我们应用程序的性能。

总结起来,CompletableFuture 是 Java 8 提供的一种强大的异步编程工具,可用于解决异步操作的问题。CompletableFuture 可以通过链式编程来组成异步操作链,在提高效率的同时也为程序提供了更加优雅的代码实现方案。尽管异步编程带来了一些复杂性,需要开发人员在编写代码时更加小心,但当正确地使用 CompletableFuture 时,它可以帮助我们轻松地实现高效率、可维护和高质量的代码。

위 내용은 비동기 프로그래밍을 위해 Java에서 CompletableFuture 함수를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.