异步工具类 - AsyncUtil
# 异步工具类 - AsyncUtil
简介
AsyncUtil
是 Hutool 提供的异步操作工具类,基于 JDK8
中的 CompletableFuture
进行封装,适用于需要进行异步操作的场景,如异步调用微服务、异步查询数据库、异步处理大量数据等。
# 1. 使用场景
- 异步处理任务:在并发任务场景中,利用异步执行可以提高处理效率,减少阻塞等待。
- 多任务并行处理:多个任务可以并行执行,减少总的执行时间。
- 任务结果收集:异步任务执行完成后,需要统一收集结果,进行后续处理。
# 2. 主要方法
# 2.1 等待所有任务执行完毕
waitAll
方法用于等待一组异步任务全部执行完毕,通常用于需要所有任务完成后再进行下一步操作的场景。
# 示例:等待所有异步任务完成
import cn.hutool.core.thread.AsyncUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class AsyncUtilExample {
public static void main(String[] args) {
List<CompletableFuture<Void>> tasks = new ArrayList<>();
// 创建多个异步任务
for (int i = 0; i < 5; i++) {
int taskId = i;
tasks.add(CompletableFuture.runAsync(() -> {
System.out.println("执行任务: " + taskId);
try {
// 模拟任务执行时间
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务完成: " + taskId);
}));
}
// 等待所有任务完成
AsyncUtil.waitAll(tasks);
System.out.println("所有任务已完成");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 方法签名:
public static void waitAll(List<CompletableFuture<?>> futures)
:等待所有异步任务完成。
- 参数说明:
futures
: 包含多个CompletableFuture
任务的列表。
- 作用:在需要所有任务执行完毕后再继续后续逻辑的场景中使用。
- 实际开发场景:在微服务调用、批量数据处理等场景中,多个任务可以并行处理,全部完成后再进行数据汇总或后续操作。
# 2.2 等待任意一个任务执行完毕
waitAny
方法用于等待多个异步任务中任意一个完成,适用于只需要任一结果即可继续操作的场景。
# 示例:等待任意一个异步任务完成
import cn.hutool.core.thread.AsyncUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class AsyncUtilExample {
public static void main(String[] args) {
List<CompletableFuture<Void>> tasks = new ArrayList<>();
// 创建多个异步任务
for (int i = 0; i < 5; i++) {
int taskId = i;
tasks.add(CompletableFuture.runAsync(() -> {
System.out.println("执行任务: " + taskId);
try {
// 模拟任务执行时间
Thread.sleep(1000 + taskId * 500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务完成: " + taskId);
}));
}
// 等待任意一个任务完成
AsyncUtil.waitAny(tasks);
System.out.println("任意一个任务已完成");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- 方法签名:
public static void waitAny(List<CompletableFuture<?>> futures)
:等待任意一个异步任务完成。
- 参数说明:
futures
: 包含多个CompletableFuture
任务的列表。
- 作用:在只需要任一任务完成即可继续后续操作的场景中使用。
- 实际开发场景:在多数据源查询中,可以并行查询多个数据源,获取最先返回的结果来提升响应速度。
# 2.3 获取异步任务结果
get
方法用于获取异步任务的结果,适用于需要同步获取异步计算结果的场景。
# 示例:获取异步任务结果
import cn.hutool.core.thread.AsyncUtil;
import java.util.concurrent.CompletableFuture;
public class AsyncUtilExample {
public static void main(String[] args) {
// 创建一个异步任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
// 模拟任务执行时间
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "异步任务结果";
});
// 获取异步任务结果
String result = AsyncUtil.get(future);
System.out.println("任务结果: " + result); // 输出结果: 异步任务结果
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 方法签名:
public static <T> T get(CompletableFuture<T> future)
:获取异步任务结果。
- 参数说明:
future
: 表示异步计算结果的CompletableFuture
。
- 返回值:异步任务的结果。
- 作用:在需要同步获取异步任务的结果时使用。
- 实际开发场景:在异步计算或远程调用中,等待计算完成并获取结果。
# 3. 实际应用场景
- 异步微服务调用:在微服务架构中,多个服务调用可以并行执行,使用
AsyncUtil
等待所有调用完成后进行统一处理。 - 批量数据处理:在数据处理任务中,多个任务可以并行处理,使用
AsyncUtil.waitAll
进行结果收集。 - 快速响应查询:在需要快速响应的场景中,通过
AsyncUtil.waitAny
获取第一个返回结果的任务,减少响应时间。
# 4. 注意事项
- 异步任务的执行时间不可控,使用
waitAll
时需要考虑超时处理。 get
方法是同步等待异步结果的返回,可能会阻塞当前线程,应谨慎使用。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08