12
110 天前
@Vedar @1194129822 @lancelee01 @micean 感谢各位的热情解答,我很受启发。再结合朋友给的例子,我仔细读了下源码,已经大致能复盘这个错误了。
**inner 线程池 reject 的原因:**
1. 主要原因:队列太小,这里给的是 1,实际每个 outer 线程要产生 3 个任务
2. 次要原因:outter 线程里面使用 countdownlatch 确实不能起到很好的限流作用,
**次要原因分析:**
如 runWorker()源码所示,run 执行完毕并不能代表线程任务执行完毕。这意味着 outter 线程与 inner 线程的空闲线程数可能不是 1:3 的关系。但这里可以通过让 outter 线程 sleep 等待 inner 先执行完成,规避这个因素的影响。规避后,问题还是会存在,说明不是主要原因。
**主要原因分析:**
先来看个案例
```
static class MyLinkedBlockingQueue extends LinkedBlockingQueue {
public MyLinkedBlockingQueue(int capacity) {
super(capacity);
}
@Override
public boolean offer(E o) {
System.out.println("任务加入,当前队列数:" + this.s