import java.util.concurrent.*;
import java.util.concurrent.CompletableFuture;
public class EcommerceAsyncTasks {
// 创建一个固定大小的线程池,根据实际情况调整大小
private static final ExecutorService executorService = Executors.newFixedThreadPool(10);
public static void main(String[] args) {
CompletableFuture.supplyAsync(() -> queryProductStock(), executorService)
.thenCompose(stock -> {
if (stock > 10) {
return recommendRelatedProducts(stock);
} else {
return generateRestockReminder(stock);
}
})
.thenAccept(result -> System.out.println("Result: " + result))
.exceptionally(ex -> {
System.err.println("An error occurred: " + ex.getMessage());
return null;
})
.whenComplete((result, ex) -> {
executorService.shutdown();
});
}
private static int queryProductStock() {
// 模拟查询商品库存的异步任务
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return (int) (Math.random() * 20);
}
private static CompletableFuture<String> recommendRelatedProducts(int stock) {
return CompletableFuture.supplyAsync(() -> {
// 模拟向用户推荐相关商品的异步任务
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Recommended products for stock " + stock;
}, executorService);
}
private static CompletableFuture<String> generateRestockReminder(int stock) {
return CompletableFuture.supplyAsync(() -> {
// 模拟生成补货提醒的异步任务
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Restock reminder for stock " + stock;
}, executorService);
}
}
- 线程池:创建了一个固定大小的线程池
executorService
,使用 Executors.newFixedThreadPool(10)
来避免创建过多线程导致资源浪费。
- 异步任务:
queryProductStock
方法模拟查询商品库存,通过 TimeUnit.SECONDS.sleep(1)
模拟异步操作。
recommendRelatedProducts
和 generateRestockReminder
方法分别模拟推荐商品和生成补货提醒的异步任务,同样使用 TimeUnit.SECONDS.sleep(1)
模拟耗时操作。
- 业务逻辑:
CompletableFuture.supplyAsync(() -> queryProductStock(), executorService)
启动查询商品库存的异步任务,并使用线程池执行。
thenCompose
根据库存数量决定后续异步任务,大于10执行推荐商品任务,小于等于10执行生成补货提醒任务。
thenAccept
处理最终结果并打印。
exceptionally
捕获并处理过程中发生的异常。
whenComplete
在任务完成后关闭线程池。