Java 线程池中无界队列有什么风险
使用无界队列(如 linkedblockingqueue 默认构造函数)的主要风险是内存溢出(oom)。当任务提交速度超过线程处理速度时,队列会无限增长,最终耗尽堆内存。为了避免这个问题,应限制队列容量或设置拒绝策略。

如何配置有界队列来避免 OOM
通过指定队列大小参数创建 LinkedBlockingQueue,可以限制最大积压任务数。当队列满且线程池达到最大线程数时,触发 RejectedExecutionHandler 拒绝新任务,从而保护系统稳定。

你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
import java.util.concurrent.*;
public class BoundedPoolDemo {
public static void main(String[] args) {
// 核心线程5,最大线程10,队列容量100
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(100);
ThreadPoolExecutor pool = new ThreadPoolExecutor(
5, 10, 60L, TimeUnit.SECONDS,
queue,
new ThreadPoolExecutor.CallerRunsPolicy()
);
// 模拟提交大量任务
for (int i = 0; i < 200; i++) {
final int taskId = i;
pool.submit(() -> {
System.out.println("Task " + taskId + " running on " + Thread.currentThread().getName());
try { Thread.sleep(10); } catch (InterruptedException e) {}
});
}
pool.shutdown();
}
}队列满时的具体行为表现
当队列达到设定的容量上限(如100),且活跃线程数达到最大线程数(如10)时,再提交新任务将直接触发拒绝策略。在示例中使用的 CallerRunsPolicy 会让调用 submit 的线程亲自执行该任务,这会导致提交线程阻塞,从而降低任务提交速率,起到背压作用。
立即学习“Java免费学习笔记(深入)”;


















