import java.util.concurrent.*;
public class EcommerceAsyncTasks {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
CompletableFuture<Integer> taskA = CompletableFuture.supplyAsync(() -> {
// 模拟查询商品库存
try {
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return 10;
}, executorService);
CompletableFuture<Double> taskB = CompletableFuture.supplyAsync(() -> {
// 模拟查询商品价格
try {
Thread.sleep(150);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return 100.0;
}, executorService);
CompletableFuture<String> taskC = CompletableFuture.supplyAsync(() -> {
// 模拟查询商品促销信息
try {
Thread.sleep(180);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "满100减20";
}, executorService);
CompletableFuture<?> anyOfFuture = CompletableFuture.anyOf(taskA, taskB, taskC);
CompletableFuture<String> resultFuture = anyOfFuture.applyToEither(
CompletableFuture.delayedFuture(100, TimeUnit.MILLISECONDS),
completedFuture -> {
if (completedFuture == taskA) {
int stock = taskA.join();
return stock == 0? "商品缺货" : "库存数量: " + stock;
} else if (completedFuture == taskB) {
double price = taskB.join();
double discountPrice = price * 0.8; // 假设8折
return "折扣价格: " + discountPrice;
} else {
String promotion = taskC.join();
return "促销内容: " + promotion;
}
}
);
resultFuture.thenAccept(System.out::println).join();
executorService.shutdown();
}
}
性能分析
- 并发执行:使用
CompletableFuture.supplyAsync
方法将任务提交到线程池,使得任务A、B、C可以并发执行,提高了整体的执行效率。
- 超时控制:通过
CompletableFuture.delayedFuture(100, TimeUnit.MILLISECONDS)
设置了100毫秒的超时时间,避免了长时间等待任务完成,提高了系统的响应速度。
可扩展性分析
- 易于添加任务:如果需要添加新的异步任务,只需要创建新的
CompletableFuture
并添加到 CompletableFuture.anyOf
方法中即可,代码结构清晰,易于维护和扩展。
- 线程池管理:使用
ExecutorService
管理线程池,可以根据系统资源和任务负载调整线程池的大小,提高系统的可扩展性和稳定性。同时,在任务完成后及时关闭线程池,避免资源浪费。