文章目录
Complete方法介绍
CompletableFuture
类中的 complete()
方法用于手动完成一个异步任务,并设置其结果。通过调用 complete()
方法,可以将一个特定的结果设置到 CompletableFuture
对象中,然后任何等待该异步任务的操作都会得到这个预先设置的结果。
源代码:
其中,T
是 CompletableFuture
对象的泛型类型,表示异步任务的结果类型。参数 value
是设置给异步任务的结果。
注意:
- 一旦调用了
complete()
方法,CompletableFuture
对象的状态会立即变为已完成,而且之后任何对该对象的计算都不会再触发异步任务的执行。如果该对象已经处于完成状态,再次调用complete()
方法不会有任何效果。 - 如果异步任务已经抛出了异常,调用
complete()
方法将不会有任何效果。此时,可以使用completeExceptionally(Throwable ex)
方法手动设置异步任务的异常结果。 - 如果有多个线程同时尝试调用
complete()
方法,只有第一个成功的线程能够设置结果,其他线程的调用将被忽略。
示例:
public class TestCompletableFuture {
public static void main(String[] args) {
CompletableFuture<String> future = new CompletableFuture<>();
System.out.println("1");
// 启动一个新线程,模拟异步任务
new Thread(() -> {
try {
// 模拟异步任务的耗时操作
Thread.sleep(2000);
// 手动完成异步任务并设置结果
future.complete("Hello World");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
System.out.println("2");
// 等待异步任务的完成,并获取结果
try {
String result = future.get();
System.out.println("异步任务的结果:" + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println("3");
}
}
输出:
其中:CompletableFuture
类中的 get()
方法用于等待异步任务的完成,并获取其结果。当调用 get()
方法时,如果异步任务已经完成,则该方法会立即返回异步任务的结果;如果异步任务尚未完成,则 get()
方法会阻塞当前线程,直到异步任务完成并返回结果。
另外get()
方法还可用于设置超时时间:get(long timeout, TimeUnit unit)
。
timeout
参数表示超时时间的数量,unit
参数表示超时时间的时间单位。如果在指定的超时时间内异步任务完成了,则 get()
方法会立即返回异步任务的结果;如果超过了指定的超时时间,但异步任务仍未完成,则 get()
方法会抛出 TimeoutException
异常。
Get方法介绍
CompletableFuture 的 get
方法用于等待 CompletableFuture 计算完成并获取其结果。该方法会阻塞调用线程,直到 CompletableFuture 完成或者当前线程被中断。
CompletableFuture 类有两个 get 方法:
- get():无限期地等待 CompletableFuture 完成并返回结果。
- get(long timeout, TimeUnit unit):等待指定的时间,如果在超时时间内 CompletableFuture 仍未完成,则抛出 TimeoutException。
方法签名:
public T get() throws InterruptedException, ExecutionException
public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
返回值: CompletableFuture 计算的结果。
异常:
- InterruptedException:如果当前线程在等待过程中被中断。
- ExecutionException:如果计算抛出了异常。
- TimeoutException:如果在指定的时间内没有完成(仅适用于带超时的 get 方法)。
示例:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureGetExample {
public static void main(String[] args) {
// 创建一个异步任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
// 模拟耗时操作,睡眠 2 秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, World!";
});
// 使用 get() 方法等待结果
try {
String result = future.get();
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class CompletableFutureGetWithTimeoutExample {
public static void main(String[] args) {
// 创建一个异步任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
// 模拟耗时操作,睡眠 2 秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, World!";
});
// 使用 get(long timeout, TimeUnit unit) 方法等待结果
try {
String result = future.get(1, TimeUnit.SECONDS);
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
if (e instanceof TimeoutException) {
System.out.println("Task timed out");
} else {
e.printStackTrace();
}
}
}
// 这段代码使用 get(long timeout, TimeUnit unit) 方法等待 CompletableFuture 完成,最多等待 1 秒。如果任务在 1 秒内没有完成,将抛出 TimeoutException。由于任务需要 2 秒才能完成,所以这段代码会输出 "Task timed out"。
}
CompletableFuture 的 get 方法是等待异步任务完成并获取结果的常用方法。get() 方法会无限期地等待,而 get(long timeout, TimeUnit unit) 方法允许你设置一个超时时间。如果在超时时间内任务没有完成,将抛出 TimeoutException。这两个方法都可能抛出 InterruptedException 和 ExecutionException,因此需要在代码中处理这些异常。