JAVA的Executor框架
Executor架构示意图
Executor接口
Executor接口是Executor框架中的最基础的部分,定义了一个用于执行Runnable的execute方法,他没有实现类,只有一个子接口ExecutorService
ExecutorService
|
|
ExecutorService接口继承自Executor接口,定义了终止、提交,执行任务、跟踪任务返回结果等方法
Executors
Executors提供生成各种类型的ExecutorService线程池实例
- newFixedThreadPool:固定线程池,ExecutorService 创建一个固定线程数量的线程池,并行执行的线程数量不变,线程当前任务完成后,可以被重用执行另一个任务
- newCachedThreadPool:可缓存线程池,ExecutorService 创建一个线程池,按需创建新线程,就是有任务时才创建,空闲线程保存60s,当前面创建的线程可用时,则重用它们
- newSingleThreadExecutor:单线程执行器,线程池中只有一个线程,依次执行任务
- newScheduledThreadPool:线程池按时间计划来执行任务,允许用户设定执行任务的时间
- newSingleThreadScheduledExecutor:线程池中只有一个线程,它按规定时间来执行任务
Runnable Callable Futrue接口
Runnable和Callable的区别
- Callable的执行方法是call,runnable的执行方法是run
- Callable接口可以接收泛型,同时它执行任务后有返回值,而Runnable无返回值
- call方法可以抛出异常,run方法不可以
Futrue接口
|
|
Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果
ThreadPoolExecutor
ThreadPoolExecutor是线程池的实现类
|
|
构造参数说明:
- corePoolSize:核心线程数
- maximumPoolSize: 线程池能容纳的最大线程数
- keepAliveTime: 非核心线程闲置超时时间
- unit: 指定超时时间单位,如TimeUnit.SECONDS
- workQueue:线程池中的队列任务,常用的三种队列有SynchronousQueue,LinkedB lockingDeque,ArrayBlockingQueue线程工厂,提供创建新线程的功能。
- ThreadFactor:通过线程工厂可以对线程的一些属性进行定制
- RejectedExecutionHandler:当线程池中的资源已经全部使用,添加新线程被拒绝时,会调用RejectedExecutionHandler的rejectedExecution方法。
线程池执行示意图
提交线程的两种方式
- 通过execute()方法
- 通过submit()方法