执行器
构建一个新的线程是有一定代价的,如果程序中创建了大量的生命期很短的线程,就应该使用线程池。一个线程池中包含许多准备运行的空
闲线程。将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法准备退出时,线程不会死亡,而是在池中准备为下一个请求提
供服务。另一个使用线程池的理由是减少并发线程的数目。
Executor有许多静态工厂方法用来构建线程池。
ThreadPoolExecutor类对象实现了ExecutorServiec接口,调用submit方法可以将一个Runnable对象或Callable对象提交给ExecutorService。调用submit时,会得到一个Future对象,可用来查询该任务的状态。当用完一个线程池的时候调用shutdown。该方法启动该池的关闭序列。被关闭的执行器不再接受新的任务。当所有任务都完成以后,线程池中的线程死亡。调用shutdownNow取消尚未开始的所有任务并试图中断正在运行的线程。
newCachedThreadPool:必要时创建新线程;空闲线程被保留60秒。
newFixedThreadPool:包含固定数量的线程。
newSingleThreadExecutor:顺序执行每一个提交的任务,类似于Swing事件分配线程。
ScheduleExecutorService接口具有预订执行或重复执行任务而设计的方法。可以预订Runnable或Callable在初始的延迟之后只运行一
次,也可以预订一个Runnable对象周期性地运行。
newScheduledThreadPool:用于预订执行而构建的固定线程池。
newSingleThreadScheduleExecutor:用于预订执行而构建的单线程"池"。
下面程序演示ThreadPoolExecutor创建线程池的方法:对于newCachedThreadPool,线程全部启动;对于newFixedThreadPool方法,先启动固定数量的线程,每完成一个线程就会启动一个新线程;newSingleThreadExecutor方法,所有的线程均等待上一个线程执行完毕再执行。