在Java中处理异步任务时,CompletableFuture类提供了一种更为清晰和易于维护的方法。它代表了异步计算的未来结果。本文将介绍如何创建简单的CompletableFuture,如何使用它返回结果,如何组合多个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...");
// 模拟一个长时间运行的任务
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
future.join(); // 等待任务完成
System.out.println("Task completed.");
}
}
在这个例子中,CompletableFuture.runAsync()
异步执行一个任务,而 future.join()
则阻塞主线程直到任务完成。
也可以使用CompletableFuture来从异步任务中返回结果:
import java.util.concurrent.CompletableFuture;
public class CompletableFutureWithResult {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
// 模拟计算
return 5 * 5;
});
future.thenAccept(result -> {
System.out.println("The result is: " + result);
}).join();
}
}
CompletableFuture.supplyAsync()
用于返回结果的任务,而 thenAccept()
在计算完成后处理结果。
处理多个异步任务是一个常见的用例。CompletableFuture提供了几种方法来组合futures。
可以组合多个CompletableFuture的结果:
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()
用于组合两个futures的结果,而 thenAccept()
用于处理组合后的结果。
当需要等待多个futures完成时,可以使用 CompletableFuture.allOf()
:
import java.util.concurrent.CompletableFuture;
public class AllOfExample {
public static void main(String[] args) {
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
// 模拟任务
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
// 模拟另一个任务
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()
等待所有给定的futures完成,而 join()
确保主线程等待所有任务完成。
在异步编程中处理错误是至关重要的。CompletableFuture提供了方法来管理异常。
使用 exceptionally()
来处理异步任务中的异常:
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();
}
}
exceptionally()
捕获并处理异常。它允许提供后备结果或处理错误。
CompletableFuture在Java中处理并发请求时提供了强大而灵活的方法。以下是其优缺点: