CompletableFuture is part of the java.util.concurrent package and offers a way to write asynchronous, non-blocking code in a more readable and maintainable manner. It represents a future result of an asynchronous computation.
To start with CompletableFuture , you can create a simple asynchronous task. Here’s an example:
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."); } }
Demo Result:
Running asynchronously... Task completed.
You can also use CompletableFuture to return results from asynchronous tasks:
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(); } }
Demo Result:
The result is: 25
Handling multiple asynchronous tasks is a common use case. CompletableFuture provides several methods to combine futures.
You can combine results from multiple 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(); } }
Demo Result:
Combined result: 15
When you need to wait for multiple futures to complete, use 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."); } }
Demo Result:
All tasks completed.
Handling errors is essential in asynchronous programming. CompletableFuture provides methods to manage exceptions.
Use exceptionally () to handle exceptions in asynchronous tasks:
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(); } }
Demo Result:
Exception occurred: Something went wrong!
In this guide, we've explored how CompletableFuture can be used to handle concurrent requests in Java. From creating simple asynchronous tasks to combining multiple futures and handling errors, CompletableFuture provides a robust and flexible approach to asynchronous programming.
If you have any questions or need further assistance, feel free to leave a comment below. I’d be happy to help!
Read posts more at : Handling Multithreading in Java with Completable Future
The above is the detailed content of Handling Multithreading in Java with Completable Future. For more information, please follow other related articles on the PHP Chinese website!