Executor框架简介
JDK将工作单元和执行机制分离,工作单元包括Runnable和Callable,执行机制由Executor框架提供;
两级调度模型:Java使用Executor框架将任务映射为线程;操作系统将这些线程映射到硬件处理器上;
Executor框架有3大部分组成:
任务:包括Runnable和Callable接口;(创建任务,使用Executors提供的方法可以把Runnable转成Callable)
任务的执行:包括Executor和ExecutorService接口及实现类ThreadPoolExecutor和ScheduledThreadPoolExecutor;(执行任务)
异步计算的结果:包括接口Future和实现类FutureTask;(获取任务结果或取消任务FutureTask.cancel)
ThreadPoolExecutor:使用工厂类Executors创建
FixedThreadPool:固定线程数,适用于负载较重的服务器;coreSize=maxSize,超时时间为0,空闲线程不会等待新任务而被立即终止,使用无界的LinkedBlockingQueue接受任务,因此不会拒绝任务;
SingleThreadExecutor:单线程,适用于顺序执行单个任务;coreSize=maxSize=1,其他同FixedThreadPool;
CachedThreadPool:根据需要创建,无界线程池,适用于执行时间较短的小任务,负载较轻的服务器;coreSize为0,maxSize为Int最大值,超时时间为1分钟,使用SynchronousQueue,作为队列,极端情况会不断创建线程而耗尽CPU和内存;
ScheduledThreadPoolExecutor:使用工厂类Executors创建
ScheduledThreadPoolExecutor:固定线程数,适用于需要限制后台线程数的场景;
SingleThreadScheduledExecutor:单线程执行;
使用DelayQueue延迟队列作为工作队列,调度任务被封装成ScheduledFutureTask,工作队列为有限队列,按照执行时间和序列号排序;
获取任务:先Lock上锁,获取第一个元素,若为空则Condition.await,否则则获取元素并signalAll所有等待线程;
添加任务:先Lock上锁,再添加上元素,如果添加的是头元素则signalAll;
FutureTask
FutureTask实现Future接口和Runnable接口,状态包括:未启动(未执行run)、已启动(执行run)、已完成;
get:未启动和已启动时会阻塞直到已完成,已完成时会立刻返回结果或抛异常;
cancel:未启动时导致任务永远不会被执行,已启动时cancel(true)以中断的方式停止任务,cancel(false)不影响,已完成时返回false;
基于AQS实现,内部实现Sync的同步器。
网友评论