Java에서 비동기식으로 메서드 호출

Muhammad Zeeshan 2023년10월12일
  1. Thread를 사용하여 Java에서 비동기식으로 메서드 호출
  2. FutureTask를 사용하여 Java에서 비동기식으로 메서드 호출
  3. CompletableFuture를 사용하여 Java에서 비동기식으로 메서드 호출
  4. EA Async를 사용하여 Java에서 비동기식으로 메서드 호출
  5. Cactuos 라이브러리를 사용하여 Java에서 비동기식으로 메서드 호출
Java에서 비동기식으로 메서드 호출

이 기사에서는 Java에서 비동기식으로 함수를 호출하는 방법을 배웁니다.

시작하기 위해 FutureTask 및 CompletableFuture와 같은 Java의 내장 비동기 프로그래밍 도구 중 일부를 살펴보겠습니다. 그런 다음 EA Async 및 Cactuos와 같은 즉시 사용 가능한 솔루션을 제공하는 일부 라이브러리를 살펴보겠습니다.

Thread를 사용하여 Java에서 비동기식으로 메서드 호출

비동기 작업을 수행하기 위해 새 스레드를 시작할 수 있습니다. 더 이해하기 쉽습니다.

두 개의 정수를 더하고 결과를 출력하는 새 스레드를 만들어 보겠습니다.

class example {
  public static void main(String[] args) {
    int num1 = 4;
    int num2 = 5;
    int result = num1 + num2;
    Thread T = new Thread(
        () -> { System.out.println("Addition of " + num1 + " and " + num2 + " is " + result); });
    T.start();
  }
}

FutureTask를 사용하여 Java에서 비동기식으로 메서드 호출

Future 인터페이스를 사용하면 FutureTask를 사용하여 비동기 작업을 수행할 수 있습니다. ExecutorService의 submit 메소드를 사용하여 프로젝트를 비동기적으로 실행하고 FutureTask 개체를 반환할 수 있습니다.

예를 들어 다음은 숫자의 계승을 찾는 방법입니다.

int num1 = 9;

ExecutorService tp = Executors.newCachedThreadPool();
Future<double> futureTask = tp.submit(() -> factorial(num1));

while (!futureTask.isDone()) {
  System.out.println("Still processing the task");
}
double result = futureTask.get();
tp.shutdown();

작업이 완료되었는지 확인하기 위해 Future 인터페이스의 isDone 기능을 활용했습니다. 그런 다음 get 메서드를 사용하여 결과를 얻었습니다.

CompletableFuture를 사용하여 Java에서 비동기식으로 메서드 호출

FutureCompletionStage의 하이브리드인 CompletableFuture는 Java 8에 도입되었습니다. supplyAsync, runAsync, thenApplyAsync와 같은 비동기 프로그래밍 기술이 있습니다.

CompletionStage는 약속입니다. 계산이 어느 시점에서 완료될 것임을 보장합니다.

CompletionStage는 스테이지가 완료될 때 실행할 콜백을 첨부하는 여러 메서드를 제공하기 때문에 유용합니다.

처음부터 시작하여 간단한 비동기 계산을 만들어 보겠습니다.

CompletableFuture와 함께 supplyAsync를 사용하여 Java에서 비동기식으로 메서드 호출

CompletableFuture.supplyAsync(this::sendMsg);

그렇게 간단하게 supplyAsync 함수는 비동기 코드가 포함된 공급자를 수락합니다. 이 예에서 sendMsg 기능을 사용하려고 합니다.

CompletableFuture와 함께 thenAccept를 사용하여 Java에서 비동기식으로 메서드 호출

CompletableFuture.supplyAsync(this::sendMsg).thenAccept(this::notify);

첫 번째 예에서는 sendMsg를 실행하여 메시지를 비동기식으로 보냅니다. 메시지의 배달 상태를 알려주는 콜백을 추가해 보겠습니다.

콜백은 여러 가지 방법으로 도입될 수 있습니다. 한 가지 방법은 thenAccept를 사용하는 것입니다. 이 예에서 사용자는 이전 계산의 결과를 완료한 후 처리하도록 알림을 받아야 합니다.

EA Async를 사용하여 Java에서 비동기식으로 메서드 호출

다음은 비동기 코드를 단계적으로 작성하여 프로그래밍과 확장을 훨씬 쉽게 만드는 Java의 또 다른 기능입니다. Electronic Arts는 ea-async 패키지를 통해 Java 환경에서 사용할 수 있는 async-await 기능의 작성자입니다.

이 기능은 런타임 코드를 변환하고 completeableFuture에 필적하는 await 메서드 호출을 다시 작성합니다.

따라서 우리는 Async.init 함수를 호출하여 Async 런타임을 초기화함으로써 위의 completeableFuture 코드를 구현하기 위해 await 메소드로 알려진 EA-sync 메소드를 사용할 수 있습니다.

여기에서 EA의 Async 클래스가 제공하는 await 함수를 사용하여 이전에 설명된 CompletableFuture 코드를 수정합니다.

static {
  Async.init();
}

Async 런타임 분석을 설정하기 위해 Async.init 함수를 정적으로 사용합니다.

public double example2(int num1) {
  CompletableFuture<double> cf = CompletableFuture.supplyAsync(() -> factorial(num1));
  double result = Async.await(cf);
}

런타임 시 async 함수는 CompletableFuture 체인을 사용하여 유사하게 작동하도록 코드를 변경하고 await 메서드 호출을 다시 작성합니다.

Cactuos 라이브러리를 사용하여 Java에서 비동기식으로 메서드 호출

비동기 작업의 경우 이 라이브러리는 Async 클래스를 제공합니다. Cactus 라이브러리에는 텍스트 조작에서 데이터 구조에 이르기까지 광범위한 레퍼토리가 있습니다.

이 라이브러리의 기본 유형 및 기능은 객체 지향 설계 개념에 더 중점을 두고 있지만 Guava 및 Apache Commons와 같은 다른 라이브러리에서 제공하는 것과 유사합니다.

여기에서 Cactoos의 Async 클래스의 인스턴스를 사용하여 숫자의 계승을 찾습니다.

Async<Integer, Double> a = new Async<Integer, Double>(inputdata -> factorial(inputdata));
Future<Double> asyncFuture = a.apply(num1);
Double result = asyncFuture.get();

apply 함수는 ExecutorService.submit 메서드를 사용하여 Future 인터페이스 개체를 작동하고 반환합니다. Cactuos 라이브러리는 Apache Commons 라이브러리에 있는 정적 메소드와 동일한 기능을 수행하는 클래스를 제공합니다.

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

관련 문장 - Java Method