Executor框架是java 5 中引入的,内部使用了线程池机制。Executor框架包括:Executor, ExecutorService,Executors,ThreadPoolExecutor等。
Executor接口中定义一个方法execute(Runnable command),该方法接收一个Runnable实例,它用来执行一个任务,任务即是一个实现了Runnable接口的类。
ExecutorService继承了Executor的接口,同时提供了更丰富的生命周期管理的方法。ExecutorService的生命周期有3种状态:运行、关闭和已停止。
shutdown方法将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成——包括哪些还未开始执行的任务。
shutdownNow方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。
ThreadPoolExecutor为一些Executor提供了基本的实现,这些Executor是由Executors中newCachedThreadPool、newFixedThreadPool等方法返回的。ThreadPoolExecutor是一个灵活的、稳定的线程池,允许进行各种定制。
public ThreadPoolExecutor(int corePoolSize,//线程池的基本大小 int maximumPoolSize,//最大大小 long keepAliveTime,//存活时间 Timeout unit, SlockingQueue<Runable> workQueue, ThreadFactory threadFactory, RejectExecutionHandler handler){...}通过调节线程池的基本大小和存活时间,可以帮助线程池回收空闲线程占有的资源。
newFixedThreadPool工厂方法将线程池的基本大小和最大大小设置为参数中指定的值,而且创建的线程池不会超时。newCachedThreadPool工厂方法将线程池的最大大小设置为Integer.MAX_VALUE,而将基本大小设置为零,并将超时设置为1分钟,这种方式创建出来的线程池可以无限扩展,并且当需求降低会自动收获。 //对通过标准工厂方法创建的Executor进行修改 ExecutorService exec = Execoutors.newCachedThreadPool(); if(exec instanceof ThreadPoolExecutor) ((ThreadPoolExecutor) exec).setCorePoolSize(10); else throw new AssertionError(*Oops, bad assumption);