并发面试题:当任务数超过了线程池的核心线程数时,如何让它不进入队列?

并发面试题:当任务数超过了线程池的核心线程数时,如何让它不进入队列?
当我们提交一个任务到线程池里面的时候,它的工作原理一共分为四个步骤。

第一步:预热核心线程。
第二步:把任务添加到阻塞队列。
第三步:如果添加到阻塞队列失败,则会创建非核心线程增加处理效率。
第四步:如果非核心线程数达到了阈值,就会触发拒绝策略。

所以如果我们希望这个任务不进入到这样一个阻塞队列,那么只需要去影响第二个步骤的执行逻辑就可以了。

在java的线程池里面,它的构造方法里面有一个参数,可以去修改阻塞队列的这样一个类型,其中有一个阻塞队列叫synchronousQueue,这个队列它是不能存储任何元素的阻塞队列,它的特性是每生产一个任务就必须指派一个消费者来处理这个任务,否则就会阻塞生产者。那么基于这个特性,我们只需要去把线程池的阻塞队列替换成synchronousQueue就好了,它就能够直接去避免任务进入到阻塞队列,而是直接去启动最大线程数量去处理这样一个任务。

你可能感兴趣的:(java,开发语言)