Thread Pools

java.util.concurrent中的大多数执行程序实现都使用线程池,该线程池由工作线程组成。这种线程与它执行的RunnableCallable任务分开存在,通常用于执行多个任务。

使用工作线程可以最大程度地减少线程创建所带来的开销。线程对象使用大量内存,在大型应用程序中,分配和取消分配许多线程对象会产生大量内存 管理 开销。

线程池的一种常见类型是固定线程池。这种类型的池始终具有指定数量的正在运行的线程。如果某个线程仍在使用时以某种方式终止,则它将自动替换为新线程。任务通过内部队列提交到池中,该内部队列在活动任务多于线程时容纳额外的任务。

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

创建使用固定线程池的执行程序的一种简单方法是在java.util.concurrent.Executors中调用newFixedThreadPool工厂方法。此类还提供以下工厂方法:

  • newCachedThreadPool方法创建具有可扩展线程池的执行程序。该执行程序适用于启动许多短期任务的应用程序。

  • newSingleThreadExecutor方法创建一个执行程序,该执行程序一次执行一个任务。

  • 几种工厂方法是上述执行程序的ScheduledExecutorService版本。

如果上述工厂方法提供的执行程序都不满足您的需求,则构造java.util.concurrent.ThreadPoolExecutorjava.util.concurrent.ScheduledThreadPoolExecutor的实例将为您提供其他选择。