CompletableFuture异步示例代码
时间: 2023-11-16 07:59:35 浏览: 90
CompletableFuture是Java8中新增的异步编程工具,它可以让我们更加方便地进行异步编程。下面是一个CompletableFuture的异步示例代码:
```
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步执行的代码块
return "Hello, CompletableFuture!";
});
future.thenAccept(result -> {
// 异步执行完成后的回调函数
System.out.println(result);
});
// 防止主线程退出
Thread.sleep(1000);
```
在这个示例代码中,我们使用了CompletableFuture.supplyAsync()方法来创建一个异步执行的代码块,然后使用thenAccept()方法来注册一个回调函数,当异步执行完成后,回调函数会被自动调用。需要注意的是,由于CompletableFuture是异步执行的,所以我们需要防止主线程过早退出,这里使用了Thread.sleep()方法来等待异步执行完成。
相关问题
CompletableFuture异步完整的示例
好的,下面是一个使用CompletableFuture实现异步操作的示例:
假设我们有一个方法`fetchUserData`,用于从远程服务器获取用户数据,由于网络延迟等原因,该方法需要一定的时间才能返回数据。我们可以使用CompletableFuture来异步执行该方法,避免阻塞主线程,代码如下:
```
public CompletableFuture<UserData> fetchUserDataAsync() {
CompletableFuture<UserData> future = new CompletableFuture<>();
CompletableFuture.runAsync(() -> {
try {
UserData userData = fetchUserData(); // fetchUserData是一个耗时的操作,可以考虑使用线程池进行优化
future.complete(userData);
} catch (Exception e) {
future.completeExceptionally(e);
}
});
return future;
}
```
在上述代码中,我们创建了一个CompletableFuture对象`future`,并通过`runAsync`方法在一个新的线程中异步执行`fetchUserData`方法。当该方法执行完毕后,我们通过`future.complete`方法将结果返回,或者通过`future.completeExceptionally`方法将异常信息返回。
现在,我们可以在主线程中调用`fetchUserDataAsync`方法,并通过`thenApply`方法在获取到用户数据后进行一些处理,如下所示:
```
CompletableFuture<UserData> future = fetchUserDataAsync();
future.thenApply(userData -> {
// 对获取到的用户数据进行处理
return someResult;
}).thenAccept(result -> {
// 处理完毕后,输出结果
System.out.println(result);
});
```
在上述代码中,我们通过`thenApply`方法将对用户数据的处理逻辑传递给CompletableFuture对象,当该对象获取到用户数据后,将自动执行该逻辑,并将处理结果返回。然后,我们又通过`thenAccept`方法将对处理结果的输出逻辑传递给CompletableFuture对象,当该对象处理完毕后,将自动执行该逻辑,并输出结果。
以上就是一个使用CompletableFuture实现异步操作的完整示例。
java CompletableFuture代码示例
在Java中,`CompletableFuture`是Java 8引入的一个强大的工具,用于处理异步操作。它提供了一个线程安全的方式来协调任务的执行,包括并行、串行化、错误处理以及最终值的合并。以下是一些基本的`CompletableFuture`代码示例:
1. **基础使用:**创建并获取结果
```java
CompletableFuture.supplyAsync(() -> {
Thread.sleep(2000); // 模拟耗时操作
return "Hello from a background thread";
}).thenApply(result -> {
System.out.println("Future completed with result: " + result);
return result.toUpperCase();
}).get(); // 等待任务完成
```
2. **链式调用:**多个步骤的异步操作
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return new String("Task A");
})
.thenApply(s -> s + ", Task B")
.thenApply(s -> s + ", Task C");
future.whenComplete((value, error) -> {
if (error == null) {
System.out.println("Final result: " + value);
} else {
System.out.println("An exception occurred: " + error.getMessage());
}
});
```
3. **并发处理:**并行执行多个任务
```java
List<Callable<String>> tasks = Arrays.asList(
() -> "Task 1",
() -> "Task 2"
);
CompletableFuture.allOf(tasks.stream()
.map(Callable::call)
.collect(Collectors.toList())
.stream()
.map(CompletableFuture::supplyAsync)
).join(); // 等待所有任务完成
```
4. **错误处理:**使用`exceptionally`方法处理异常
```java
CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Failed task");
})
.exceptionally(t -> {
System.err.println("Error handling: " + t.getMessage());
return "Handling failed task";
})
.thenApply(result -> "Completed with error handling");
```
阅读全文