java线程池 ThreadPoolExecutor 崩溃!!!

现象:

创建一个线程池,最大线程数5,阻塞队列长度为25,当当前任务数30+的时候,程序直接崩溃了!!

val threadPoolExecutor = ThreadPoolExecutor(3, 5,1, TimeUnit.SECONDS, LinkedBlockingDeque<Runnable>(25))


查了会源码,发现自己被这个队列的名字给忽悠了,LinkedBlockingDeque,在我印象中链表不会存在下标越界的情况,这个block也让我往阻塞当前线程那边想,问了一下朋友再查了下LinkedBlockingDeque的源码,关键代码如下,原来是下标越界,直接抛了个异常

解决方法

假设当前任务数 > 最大线程数 + 阻塞队列长度
就会导致崩溃,需要加try catch,或者创建完线程池对象后用下面这个方法。
最次的方法是扩大这个队列的长队好像有个MAX啥啥,但是这种势必会引起OOM

这个小r就是那个越界的任务,咱就可以再加一个越界的策略了,比如说加到另一个队列里存着