CompletableFuture的supplyAsync方法
时间: 2024-07-22 16:01:12 浏览: 65
`CompletableFuture.supplyAsync`是Java 8中`java.util.concurrent.CompletableFuture`类提供的一个静态方法,它允许你在异步线程上执行计算并返回结果。这个方法用于创建一个新的`CompletableFuture`实例,其初始状态是未完成的,但当提供的`Callable`或`Supplier`任务执行完毕后,会立即设置未来的结果。
基本语法如下:
```java
CompletableFuture<T> supplyAsync(Callable<T> callable)
CompletableFuture<T> supplyAsync(Supplier<T> supplier)
```
其中:
- `Callable<T>`是一个可以计算出结果的对象,提供了一个`call()`方法用于实际执行工作。
- `Supplier<T>`是一个无参函数,返回一个值。
调用`supplyAsync`不会阻塞当前线程,而是将计算委托给指定的线程池(如果没有显式配置,则默认使用ExecutorService的默认线程池)。当计算完成后,`CompletableFuture`的状态变为已完成,并可以通过`thenApply`, `thenAccept`, 或其他链式操作处理结果。
相关问题
CompletableFuture supplyAsync runAsync 有什么区别
CompletableFuture中的supplyAsync和runAsync都是用于异步执行任务的方法,但它们之间有一些区别:
1. supplyAsync方法是带有返回值的异步任务,而runAsync方法是没有返回值的异步任务。
2. supplyAsync方法需要传入一个Supplier类型的参数,该参数提供了异步执行的任务,并且返回一个CompletableFuture对象,该对象可以用于获取异步任务的结果。
3. runAsync方法需要传入一个Runnable类型的参数,该参数提供了异步执行的任务,但是没有返回值。
4. supplyAsync方法可以使用默认的线程池(ForkJoinPool.commonPool())执行异步任务,也可以使用自定义的线程池执行异步任务。而runAsync方法只能使用默认的线程池执行异步任务。
下面是一个使用supplyAsync方法的例子:
```java
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步执行的任务
return "Hello World!";
});
// 获取异步任务的结果
String result = future.get();
System.out.println(result); // 输出:Hello World!
```
下面是一个使用runAsync方法的例子:
```java
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 异步执行的任务
System.out.println("Hello World!");
});
// 等待异步任务执行完成
future.get();
```
CompletableFuture CompletableFuture.supplyAsync 异常处理
在使用 `CompletableFuture.supplyAsync` 方法时,如果异步执行过程中出现异常,则可以通过 `exceptionally` 方法进行异常处理。例如:
```
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// 异步执行过程中可能会出现异常
throw new RuntimeException("Async process failed!");
});
future.exceptionally(ex -> {
// 异常处理逻辑
System.out.println("Exception occurred: " + ex.getMessage());
return "default value";
});
```
在上述例子中,当异步执行过程中出现异常时,`exceptionally` 方法会捕获该异常并进行处理,输出异常信息并返回一个默认值。如果异步执行没有出现异常,则该方法不会被调用。
阅读全文