杨胜喜 發表於 2026-3-25 13:01:00

Java线程池完全指南:从原理到实战的7个关键点

<h2>前言</h2>
<p>线程池是Java并发编程的核心组件,也是面试必考题。本文从原理到实战,带你全面掌握线程池的7个关键点。</p>
<h2>一、为什么需要线程池?</h2>
<p>每次创建线程都有开销:</p>
<ul>
<li>线程创建需要调用系统API,开销大</li>
<li>线程销毁也需要开销</li>
<li>大量线程会消耗内存</li>
</ul>
<p>线程池解决问题:</p>
<ul>
<li>线程复用,减少创建销毁开销</li>
<li>控制最大并发数</li>
<li>提供任务队列,缓冲突发请求</li>
</ul>
<h2>二、线程池核心参数</h2>
<pre><code>public ThreadPoolExecutor(
    int corePoolSize,      // 核心线程数
    int maximumPoolSize,   // 最大线程数
    long keepAliveTime,    // 空闲线程存活时间
    TimeUnit unit,         // 时间单位
    BlockingQueue&lt;Runnable&gt; workQueue,// 任务队列
    ThreadFactory threadFactory,       // 线程工厂
    RejectedExecutionHandler handler   // 拒绝策略
)</code></pre>
<h2>三、线程池执行流程</h2>
<ol>
<li>任务来了,核心线程数未满 → 创建核心线程执行</li>
<li>核心线程已满,队列未满 → 任务加入队列</li>
<li>队列已满,线程数未达最大值 → 创建非核心线程执行</li>
<li>线程数已达最大值 → 执行拒绝策略</li>
</ol>
<h2>四、4种拒绝策略</h2>
<ul>
<li><strong>AbortPolicy</strong>:直接抛异常(默认)</li>
<li><strong>CallerRunsPolicy</strong>:由调用线程执行任务</li>
<li><strong>DiscardPolicy</strong>:直接丢弃,不抛异常</li>
<li><strong>DiscardOldestPolicy</strong>:丢弃队列中最老的任务</li>
</ul>
<h2>五、常见线程池</h2>
<pre><code>// 固定大小线程池
ExecutorService fixedPool = Executors.newFixedThreadPool(10);

// 缓存线程池(线程数无限,适合短期异步任务)
ExecutorService cachedPool = Executors.newCachedThreadPool();

// 单线程线程池
ExecutorService singlePool = Executors.newSingleThreadExecutor();

// 定时任务线程池
ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(5);</code></pre>
<h2>六、线程池最佳实践</h2>
<p><strong>CPU密集型任务:</strong>核心线程数 = CPU核数 + 1</p>
<p><strong>IO密集型任务:</strong>核心线程数 = CPU核数 * 2</p>
<pre><code>// 推荐用法:手动创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    Runtime.getRuntime().availableProcessors(),
    Runtime.getRuntime().availableProcessors() * 2,
    60L, TimeUnit.SECONDS,
    new LinkedBlockingQueue&lt;&gt;(1000),
    new ThreadFactoryBuilder().setNamePrefix("my-pool-").build(),
    new ThreadPoolExecutor.CallerRunsPolicy()
);</code></pre>
<h2>七、线程池监控</h2>
<pre><code>// 关键指标
executor.getActiveCount();   // 活跃线程数
executor.getQueue().size();    // 队列任务数
executor.getCompletedTaskCount(); // 已完成任务数
executor.getPoolSize();      // 当前线程数</code></pre>
<h2>总结</h2>
<p>掌握线程池的7个关键点,不仅能在面试中游刃有余,更能在实际项目中写出高性能的并发程序。</p>
<p><em>本文由AI辅助创作。</em></p>

</div>
<div id="MySignature" role="contentinfo">
   

---

📌 **如果觉得文章对你有帮助,欢迎点赞👍收藏⭐!**

💬 有问题或建议?欢迎在评论区留言讨论~

🔗 更多技术干货请关注作者:弥烟袅绕

📚 本文地址:https://www.cnblogs.com/czlws/p/19769257<br><br>
来源:https://www.cnblogs.com/czlws/p/19769257
頁: [1]
查看完整版本: Java线程池完全指南:从原理到实战的7个关键点