
Caused by: java.util.concurrent.RejectedExecutionException: Thread limit exceeded replacing blocked worker
- 在process方法中,使用了CompletableFuture.runAsync()对每个item并发处理。
- 默认情况下,CompletableFuture.runAsync()使用的是ForkJoinPool.commonPool(),这个线程池的大小一般是CPU核心数,并不适合大规模并发任务。
- 当任务数远大于线程池容量时,线程池会抛出RejectedExecutionException。
- Redis操作本身是IO密集型,不建议用大量线程并发操作,否则会导致资源争抢、阻塞,反而变慢
修改点:将所有CompletableFuture.runAsync(() -> { … })替换为CompletableFuture.runAsync(() -> { … }, STATISTICS_EXECUTOR)。
或者直接串行处理(如果数据量不大)
如果数据量不是很大,直接用for循环串行处理即可,避免并发带来的复杂性。
Redis批量操作优化
如果可以,尽量减少对Redis的频繁set操作,合并写入或用pipeline。
线程池资源释放
如果你用自定义线程池,建议在应用关闭时调用STATISTICS_EXECUTOR.shutdown(),避免资源泄漏。
1万+

被折叠的 条评论
为什么被折叠?



