一、背景
多线程带来的好处不言而喻,但是使用不当,也是麻烦多多。每个线程从创建到销毁,整个生命周期需要使用多类硬件资源,若频繁创建线程反而会消耗很多硬件资源,得不偿失。当执行大量任务时,将在线程创建,销毁,任务切换额外消耗大量的资源。线程池的出现解决了这类问题,线程创建后即使执行完任务仍可以继续执行其它任务,减少了每个任务调用的开销,在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。
二、线程池结构
java线程池结构(I代表接口,C代表抽象类或普通类)如下图。
Executor是线程池顶级接口,只有一个方法executor(),在某个时间执行提交的任务。
ExecutorSerivce继承Executor,添加一些新的方法,如关闭service的方法shutdown()和shutdownNow()。同时还提供了批量执行方法invokeAny 和 invokeAll等。
ScheduledExecutorService继承ExecutorSerivce,自然也继承了Executor
AbstractExecutorService实现了ExecutorSerivce,提供了方法的默认实现。
ThreadPoolExecutor类是我们用到的线程池核心类。这个类实现了线程池的各种功能。线程池工厂Executors提供的几种线程池都是基于ThreadPoolExecutor的实现,如newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool均是实例化ThreadPoolExecutor,只是因为初始化参数不同。线程池(二)主要是介绍该类的内部结构实现原理等。
ScheduleThreadPoolExecutor实现了ScheduleExecutorService接口,并继承了ThreadPoolExecutor。该类可以运行给定延迟后的命令,不同与ThreadPoolExecutor,该线程池的队列是无界的,即线程数是固定的,maxMumPoolSize不起作用。线程池工厂Executors提供的若干种类线程池则是基于ScheduleThreadPoolExecutor的实现。
如有不正确的解释,请各位大牛斧正,谢谢!后期有更深入的理解会继续更新。