>Java >java지도 시간 >Completable Future를 사용하여 Java에서 멀티스레딩 처리

Completable Future를 사용하여 Java에서 멀티스레딩 처리

WBOY
WBOY원래의
2024-09-08 22:35:03714검색

Handling Multithreading in Java with Completable Future

1. 완성 가능한 미래의 이해

CompletableFuturejava.util.concurrent 패키지의 일부이며 더 읽기 쉽고 유지 관리하기 쉬운 방식으로 비동기 비차단 코드를 작성하는 방법을 제공합니다. 이는 비동기 계산의 향후 결과를 나타냅니다.

1.1 간단한 CompletableFuture 만들기

CompletableFuture로 시작하려면 간단한 비동기 작업을 생성할 수 있습니다. 예는 다음과 같습니다.

import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            System.out.println("Running asynchronously...");
            // Simulate a long-running task
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        future.join(); // Wait for the task to complete
        System.out.println("Task completed.");
    }
}
  • CompletableFuture.runAsync()는 작업을 비동기식으로 실행합니다.
  • future.join() 작업이 완료될 때까지 메인 스레드를 차단합니다.

데모 결과:

Running asynchronously...
Task completed.

1.2 결과에 CompletableFuture 사용

CompletableFuture를 사용하여 비동기 작업의 결과를 반환할 수도 있습니다.

import java.util.concurrent.CompletableFuture;

public class CompletableFutureWithResult {
    public static void main(String[] args) {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            // Simulate a computation
            return 5 * 5;
        });

        future.thenAccept(result -> {
            System.out.println("The result is: " + result);
        }).join();
    }
}
  • CompletableFuture.supplyAsync()는 결과를 반환하는 작업에 사용됩니다.
  • thenAccept()는 계산이 완료되면 결과를 처리합니다.

데모 결과:

The result is: 25

2. 여러 CompletableFuture 결합

여러 비동기 작업을 처리하는 것이 일반적인 사용 사례입니다. CompletableFuture는 미래를 결합하는 여러 가지 방법을 제공합니다.

2.1 thenCombine으로 Future 결합하기

여러 CompletableFutures의 결과를 결합할 수 있습니다.

import java.util.concurrent.CompletableFuture;

public class CombiningFutures {
    public static void main(String[] args) {
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 5);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 10);

        CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (result1, result2) -> result1 + result2);

        combinedFuture.thenAccept(result -> {
            System.out.println("Combined result: " + result);
        }).join();
    }
}
  • thenCombine ()은 두 future의 결과를 결합합니다.
  • 결합된 결과는 thenAccept ()를 사용하여 처리됩니다.

데모 결과:

Combined result: 15

2.2 allOf로 여러 Future 처리하기

여러 future가 완료될 때까지 기다려야 하는 경우 CompletableFuture.allOf():
를 사용하세요.

import java.util.concurrent.CompletableFuture;

public class AllOfExample {
    public static void main(String[] args) {
        CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
            // Simulate task
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
            // Simulate another task
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });

        CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future1, future2);

        allOfFuture.join();
        System.out.println("All tasks completed.");
    }
}
  • CompletableFuture.allOf()는 주어진 모든 future가 완료되기를 기다립니다.
  • join()은 모든 작업이 완료될 때까지 메인 스레드가 대기하도록 합니다.

데모 결과:

All tasks completed.

3. CompletableFuture를 사용한 오류 처리

비동기 프로그래밍에서는 오류 처리가 필수적입니다. CompletableFuture는 예외를 관리하는 방법을 제공합니다.

3.1 예외적으로 예외 처리하기

비동기 작업에서 예외를 처리하려면 예외적으로()를 사용하세요.

import java.util.concurrent.CompletableFuture;

public class ExceptionHandlingExample {
    public static void main(String[] args) {
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            throw new RuntimeException("Something went wrong!");
        }).exceptionally(ex -> {
            System.out.println("Exception occurred: " + ex.getMessage());
            return null;
        });

        future.join();
    }
}
  • 예외적으로 ()는 예외를 포착하고 처리합니다.
  • 대체 결과를 제공하거나 오류를 처리할 수 있습니다.

데모 결과:

Exception occurred: Something went wrong!

4. CompletableFuture의 장점과 단점

4.1 장점

  • 비동기 실행 : 메인 스레드를 차단하지 않고 동시에 실행되는 작업을 효율적으로 처리합니다.
  • 향상된 가독성: 기존 콜백 접근 방식에 비해 비동기 코드를 처리하기 위한 더 읽기 쉽고 유지 관리 가능한 방법을 제공합니다.
  • Rich API : 여러 future를 결합, 처리, 구성하는 다양한 방법을 제공합니다.

4.2 단점

  • 복잡성 : CompletableFuture는 강력하지만 비동기 코드 관리 및 디버깅에 복잡성을 초래할 수 있습니다.
  • 예외 처리: 특히 여러 단계로 구성된 복잡한 시나리오에서는 예외 처리가 까다로울 수 있습니다.

5. 결론

이 가이드에서는 CompletableFuture를 사용하여 Java에서 동시 요청을 처리하는 방법을 살펴보았습니다. 간단한 비동기 작업 생성부터 여러 future 결합 및 오류 처리에 이르기까지 CompletableFuture는 비동기 프로그래밍에 대한 강력하고 유연한 접근 방식을 제공합니다.

질문이 있거나 추가 도움이 필요하시면 아래에 댓글을 남겨주세요. 기꺼이 도와드리겠습니다!

에서 더 많은 게시물 읽기: Handling Multithreading in Java with Completable Future

위 내용은 Completable Future를 사용하여 Java에서 멀티스레딩 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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