# 线程池

> 原文： [https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html](https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html)

`java.util.concurrent`中的大多数执行程序实现使用 _ 线程池 _，它由 _ 工作线程 _ 组成。这种线程与它执行的`Runnable`和`Callable`任务分开存在，通常用于执行多个任务。

使用工作线程可以最大限度地减少由于创建线程而产生线程对象使用大量内存，而在大型应用程序中，分配和释放许多线程对象会产生大量的内存管理开销。

一种常见类型的线程池是 _ 固定线程池 _。这种类型的池始终具有指定数量的线程运行;如果某个线程在仍在使用时以某种方式终止，它将自动替换为新线程。任务通过内部队列提交到池中，只要有多个活动任务而不是线程，该队列就会保存额外的任务。

固定线程池的一个重要优点是使用它 _ 的应用程序正常降级 _。要理解这一点，请考虑一个 Web 服务器应用程序，其中每个 HTTP 请求都由一个单独的线程处理。如果应用程序只是为每个新的 HTTP 请求创建一个新线程，并且系统接收到的请求数超过了它可以立即处理的数量，那么当所有这些线程的开销超过时，应用程序将突然停止响应 _ 所有 _ 请求。系统的容量。由于可以创建的线程数量有限制，应用程序不会像它们进入时那样快速地为 HTTP 请求提供服务，但它将在系统可以维持的时间内尽快为它们提供服务。

创建使用固定线程池的执行程序的一种简单方法是在 [`java.util.concurrent.Executors`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html) 中调用 [`newFixedThreadPool`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool-int-) 工厂方法此类还提供以下工厂方法：

*   [`newCachedThreadPool`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool-int-) 方法创建具有可扩展线程池的执行程序。此执行程序适用于启动许多短期任务的应用程序。
*   [`newSingleThreadExecutor`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newSingleThreadExecutor-int-) 方法创建一次执行单个任务的执行程序。
*   几种工厂方法是上述执行器的`ScheduledExecutorService`版本。

如果上述工厂方法提供的执行器都不能满足您的需求，构建 [`java.util.concurrent.ThreadPoolExecutor`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html) 或 [`java.util.concurrent.ScheduledThreadPoolExecutor`](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html) 的实例将为您提供其他选项。