1. 轻量级任务:10,000 个并发延迟操作
假设需要并发执行 10,000 个非阻塞延迟任务(如模拟定时请求):
线程池实现
ExecutorService executor = Executors.newFixedThreadPool(64); // 最多 64 线程
List<Future<?>> futures = new ArrayList<>();
for (int i = 0; i < 10_000; i++) {
futures.add(executor.submit(() -> {
Thread.sleep(100); // 阻塞线程
return null;
}));
}
// 需要手动等待所有 Future 完成
- 问题:线程池最大 64 线程,处理 10,000 任务需要排队,总耗时至少
(10000/64)*100ms ≈ 15.6s
。 - 缺点:线程被阻塞,无法复用;内存占用高(每个线程约 1MB)。
RxJava 实现
Observable.range(1, 10_000)
.flatMap(i ->
Observable.just(i)
.delay(100, TimeUnit.MILLISECONDS, Schedulers.io())
)
.subscribe();
- 问题:RxJava 的
delay
内部使用线程池调度,同样受限于Schedulers.io()
的线程数(默认无上限,但实际受系统限制)。 - 缺点:频繁创建
Observable
实例和线程切换,GC 压力大。
Kotlin 协程实现
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
val jobs = List(10_000) {
launch {
delay(100) // 非阻塞挂起,线程可被其他协程复用
// 执行任务
}
}
jobs.