省流侠 發表於 2025-6-25 18:33:00

【学习OR面试】请你介绍一下线程池(1)

<p>推荐阅读:</p>
<p>Java线程池实现原理及其在美团业务中的实践 - 美团技术团队</p>
<h3 id="1线程池是什么">1.线程池是什么?</h3>
<ul>
<li>
<p>定义:工具</p>
</li>
<li>
<p>解决问题:在并发环境下,系统<strong>不能够确定</strong>在任意时刻中,有多少任务需要执行,有多少资源需要投入。</p>
</li>
<li>
<p>用途:管理和复用线程,减少线程的创建和销毁开销。</p>
</li>
<li>
<p>总结:线程池是用来管理和复用线程的工具,它可以减少线程的创建和销毁开销。</p>
</li>
</ul>
<h3 id="2线程池的核心参数">2.线程池的核心参数?</h3>
<p>4+2+1=<strong>7</strong></p>
<ul>
<li>核心线程数、最大线程数、<strong>任务队列</strong>和拒绝策略</li>
<li>非核心线程的存活时间和参数单位(核心线程默认不会销毁)</li>
<li>线程工厂</li>
</ul>
<h3 id="3线程池的工作流程">3.线程池的工作流程?</h3>
<p>任务提交 → <strong>核心线程执行</strong> → <strong>任务队列缓存</strong> → <strong>非核心线程执行</strong> → <strong>拒绝策略处理</strong>。</p>
<pre><code class="language-xml">if 正在运行的线程数&lt;核心线程数:直接使用空闲的核心线程 或 创建核心线程来执行
else if 正在运行的线程数&gt;=核心线程数:放入等待队列
else if 等待队列满了&amp;&amp;正在运行的线程数&lt;最大线程数:创建非核心线程来执行(刚刚提交的这个任务)
else if 等待队列满了&amp;&amp;正在运行的线程数&gt;=最大线程数:拒绝策略的执行

最后:线程执行完毕后,线程并不会立即销毁,而是继续保持,在池中等待下一个任务。
但是,当非核心线程空闲时间超出存活时间(当前线程数量大于核心线程数时),线程会被回收。
</code></pre>
<p>总结为<strong>5种</strong>情况</p>
<h2 id="4拒绝策略有哪些">4.拒绝策略有哪些?</h2>
<ul>
<li>AbortPolicy:默认的拒绝策略,会抛 RejectedExecutionException 异常。</li>
<li>CallerRunsPolicy:让提交任务的线程自己来执行这个任务,也就是调用 execute 方法的线程。</li>
<li>DiscardOldestPolicy:等待队列会丢弃队列中最老的一个任务,也就是队列中等待最久的任务,然后尝试重新提交被拒绝的任务。</li>
<li>DiscardPolicy:丢弃被拒绝的任务,不做任何处理也不抛出异常。</li>
</ul>
<p><img src="https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javathread-68.png" alt="三分恶面渣逆袭:四种策略" loading="lazy"></p>
<p>【这个图精辟!】</p>
<h2 id="5线程池有哪几种阻塞队列">5.线程池有哪几种阻塞队列?</h2>
<p>五种。</p>
<ul>
<li>ArrayBlockingQueue:底层是数组,有界,先进先出,适合固定大小的线程池。</li>
<li>LinkedBlockingQueue:底层是链表,无界(Integer.MAX_VALUE),⚠️建议指定大小。</li>
<li>PriorityBlockingQueue:类比优先队列(堆实现),无界,可以排序。<strong>如其名:优先级高的先出。</strong></li>
<li>DelayQueue:类比PriorityBlockingQueue,<strong>带有延迟功能:元素在指定时间点之后才能取出。</strong></li>
<li>SynchronousQueue:<strong>同步队列</strong>,生产者放入元素必须等待消费者取走,否则阻塞。</li>
</ul><br><br>
来源:https://www.cnblogs.com/lazyGuai/p/18948605
頁: [1]
查看完整版本: 【学习OR面试】请你介绍一下线程池(1)