当我们提交一个任务到线程池,它的工作原理如下:
如果线程池的线程数小于corePoolSize
(核心线程阈值),即使其他核心线程处于空闲状态,也会创建一个新核心线程来运行新任务。
如果线程池的线程数大于等于corePoolSize
但少于maxPoolSize
(最大线程数阈值),则将任务放入阻塞队列。
如果阻塞队列已满,并且线程池的线程数小于maxPoolSize
,则创建一个新非核心线程来运行任务。
如果阻塞队列已满,并且线程数大于或等于maxPoolSize
,则拒绝该任务。
所以如果我们希望这个任务不进入到阻塞队列,那么只需要处理第二步就好。
在Java
线程池里,它的构造方法里有一个参数可以去修改阻塞队列的类型
其中有一个阻塞队列叫SynchronousQueue
,这个队列是不能存储任何元素的阻塞队列,它的特性是每生产一个任务就必须指派一个消费者来处理这个任务,否则就会阻塞生产者。
基于这个特性,我们只需要把线程池的阻塞队列替换成SynchronousQueue
就好了,它就能够直接去避免任务进入到阻塞队列,而是直接去启动最大线程数量去处理任务。