目录
一、Executor框架
工作单元 Runnable Callable
执行机制 Executor框架
两级调度模型
应用分解为若干个任务
上层,Executor框架控制,这些任务映射为固定数量的线程
底层,操作系统内核控制,线程映射到硬件处理器
补充:
任务是一组逻辑工作单元
线程是使任务异步执行的机制
有界队列防止高负荷的应用程序耗尽内存
public interface Executor{
void execute(Runnable command);
}
将任务的的提交与执行解耦,并用Runnable表示任务
public class ThreadPerTaskExecutor implements Executor{
public void execute(Runnable r){
new Thread(r).start();
}
}
框架结构
任务:Runnable接口或Callable接口
任务的执行:ThreadPoolExecutor和ScheduledThreadPoolExecutor
异步计算的结果:FutureTask类
说明:
Executor接口:分离任务的提交与执行
ThreadPoolExecutror:执行被提交的任务
ScheduledThreadPoolExecutor:给定延迟后或定期执行命令
使用:
create Runnable或Callable 的任务对象
Executors.callable( Runnable task) 封装为Callable对象
ExecutorService.execute( Runnable task) 交给执行
ExecutorService.submit( Callable task) 提交执行
因为submit返回FutureTask对象
所以可以直接创建FutureTask,交给ExecutorService执行
FutureTask.get() 等待任务执行完成
FutureTask.cancel() 取消此任务的执行
框架成员
1、ThreadPoolExecutor,工厂类Executors创建
1)固定线程数 FixedThreadPool
限制当前线程数量
2)单个线程 SingleThreadPool
保证顺序执行任务,且同一时间内不会有多个线程活动
3)根据需要创建 CachedThreadPool
执行很多的短期异步任务的小程序,服务器负载较轻
2、ScheduledThreadPoolExecutor
1)ScheduledThreadPoolExecutor 多个执行,限制数量
2)SingleThreadPoolExecutor 单个执行,顺序执行
3、 Future submie()
4、Runnable不会返回结果,Callable会返回结果
Callable callable(Runnable task, T result)
Callable callable(Runnable task)
补充:
Fixed: 固定长度,每提交一个任务就创建一个线程,达到最大数量,规模不再变化,Exception会补充新的线程
Cached: 可缓存,当前规模超过处理需求,回收空闲线程,需求增加时新建,不受规模限制
SIngle: 单线程,异常就创建新的,任务串行执行(FIFO, LIFO, 优先级)
Scheduled: 固定长度,延迟或定时执行
二、ThreadPoolExecutor
线程池的实现类,
四个组件:
corePool 核心线程池的大小
maximumPool 最大线程池的大小
BlockingQueue 工作队列:暂时保存任务
RejectedExecutionHandler 关闭或饱和时的方法
饱和:达到最大且工作队列已满
RejectedExecutionHandler.rejectedExecution()
1、FixedThreadPool 可重用固定线程数
核心与最大都是创建参数
keepAliveTime 为空闲线程等待新任务的最长时间,超时终止线程
少于核心,创建新线程
等于核心,任务加入工作队列
执行完任务,循环反复从工作队列中获取任务
LinkedBlockingQueue 无界队列Integer.MAX_VALUE
新任务在工作队列中,线程数不会超过核心
最大和keepAliveTime为无效参数,不会拒绝任务