在此博客文章中,我们将描述该框架的功能,灵活性和简单性,以展示一个简单的用例。
基础
执行程序框架引入了一个接口来管理任务执行: 执行程序。 Executor是用于提交任务的接口,表示为Runnable实例。 此接口还将任务提交与任务执行隔离开来 :具有不同执行策略的执行者都发布相同的提交接口:如果您更改执行策略,则提交逻辑将不受更改的影响。
如果您想提交一个Runnable实例来执行,它很简单:
Executor exec = …;
exec.execute(runnable);
线程池
如上一节所述,执行器合同未指定执行器如何执行可运行对象:这取决于您所使用的执行器的特定类型。 该框架提供了一些不同类型的执行器,每种执行器都有针对不同用例量身定制的特定执行策略。
您将要处理的最常见的执行程序类型是线程池执行程序 。,它们是ThreadPoolExecutor类(及其子类)的实例。 线程池执行程序管理一个线程池 (即将要执行任务的工作线程池)和一个工作队列 。
您肯定已经在其他技术中看到池的概念。 使用池的主要优点是减少了资源创建的开销,重用了使用后释放的结构(在这种情况下为线程)。 使用池的另一个隐式优势是可以调整资源使用量 :可以调整线程池大小以实现所需的负载,而不会损害系统资源。
该框架为线程池提供了一个工厂类,称为Executors 。 使用该工厂,您将能够创建具有不同特征的线程池。 通常,底层实现通常是相同的( ThreadPoolExecutor ),但是工厂类可帮助您快速配置线程池,而无需使用更复杂的构造函数。 出厂方法是:
- newFixedThreadPool :此方法返回最大大小固定的线程池。 它将根据需要创建新线程,直到最大配置大小。 当线程数达到最大值时,线程池将保持大小不变。
- newCachedThreadPool :此方法返回无限制的线程池,即没有最大大小的线程池。 但是,当负载减少时,这种线程池将拆除未使用的线程。
- newSingle