Home  >  Article  >  Java  >  How to use CompletableFuture to implement asynchronous concurrent programming in Java?

How to use CompletableFuture to implement asynchronous concurrent programming in Java?

WBOY
WBOYOriginal
2024-05-04 17:03:01950browse

Use CompletableFuture to implement asynchronous concurrent programming in Java: Create CompletableFuture: Create a CompletableFuture through CompletableFuture.supplyAsync(), which receives a parameterless method as a parameter and returns a value. Handling completion situations: Use the whenComplete(), thenApply(), thenAccept(), exceptionally(), and handle() methods to handle task completion, exception, and cancellation situations. Combining CompletableFutures: Chain two CompletableFutures using the thenCompose() method. Practical case: Shows how to use CompletableFuture to get a list of users from the database in parallel and get each user's details from a remote API.

如何在 Java 中使用 CompletableFuture 实现异步并发编程?

#How to use CompletableFuture to implement asynchronous concurrent programming in Java?

Introduction

CompletableFuture is a concurrency utility class introduced in Java 8 that allows you to execute tasks asynchronously and handle their completion. It provides a more elegant and simplified way to manage concurrency than traditional threads.

Basic usage

To create a CompletableFuture, you can use the CompletableFuture.supplyAsync() method, which accepts a Supplier as a parameter. Supplier is a method with no parameters and returns a value.

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");

Handling completion

One of the main functions of CompletableFuture is the ability to handle task completion. It provides a variety of methods to handle completion, exception and cancellation situations:

  • whenComplete(): Execute the specified action after the task is completed, regardless of whether the completion is successful or not.
  • thenApply(): Execute the specified function and return a new value after the task is successfully completed.
  • thenAccept(): Execute the specified consumer after the task is successfully completed.
  • exceptionally(): Execute the specified exception handler after the task fails and return a new value.
  • handle(): Execute the specified function after the task is completed, regardless of whether the task is completed successfully, and return a new value.

Combining CompletableFuture

CompletableFuture can be combined to create more complex parallel tasks. For example, you can use the thenCompose() method to chain together two CompletableFutures:

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 1);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 2);

future1.thenCompose(x -> future2.thenApply(y -> x + y));

Practical case

Suppose we have the following tasks Parallel execution is required:

  • Get the user list from the database
  • Get the details of each user from the remote API

We can use CompletableFuture to Implement it:

CompletableFuture<List<User>> futureUsers = CompletableFuture.supplyAsync(() -> getUsersFromDatabase());

CompletableFuture<Map<Integer, UserDetail>> futureDetails = CompletableFuture.supplyAsync(() -> {
    List<User> users = futureUsers.get();
    return getUsersDetailsFromApi(users);
});

CompletableFuture<List<User>> combinedFuture = futureUsers.thenCombine(futureDetails, (users, details) -> {
    for (User user : users) {
        user.setDetails(details.get(user.getId()));
    }
    return users;
});

This example shows how to use CompletableFuture to fetch data from different sources in parallel and combine them.

The above is the detailed content of How to use CompletableFuture to implement asynchronous concurrent programming in Java?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn