Executor框架是负责java线程的执行的,是一个执行机制。
在上层,java多线程程序会把应用分解为若干个任务,然后由Executor框架把任务映射到线程池里面的线程。
在底层,操作系统的内核负责把这些线程映射到硬件处理器上。
也就是应用程序通过Executor控制线程的调度,而底层的调度是通过操作系统的内核来完成的。
Executor框架的结构
主要包括三大部分:
- 任务: 包括执行任务需要实现的接口:包括Runnable接口和callable接口
- 任务的执行:包括Executor接口和继承了Executor接口的ExecutorService。有两个关键的类实现了ExecutorService接口:ThreadPoolExecutor,和ScheduledThreadPoolExecutor。
- 异步计算的结果:Future接口和实现类FutureTask
Executor框架的成员
主要成员有ThreadPoolExecutor,ScheduledThreadPoolExecutor,Future接口,Rubbable接口,Callable接口和Executors。
ThreadPoolExecutor
ThreadPoolExecutor是Executor最核心的类,它是线程池的实现类,主要有四个部分组成:
corePool:核心线程池的大小
maximumPool:最大线程池的大小
BlockingQueue:保存任务的工作队列
RejectedExecutorHandler:如果ThreadPoolExecutor已经饱和了,就是达到了最大线程池的大小而且工作队列满了,这时候,executor方法就会调用RejectedExecutionHandler。
通过Executors工具类,可以创建三种类型的ThreadPoolExecutor,
-
FixedTheadPool:可重用的固定线程数的线程池。
如果当前运行的线程数小于corePoolsize,就创建新的线程执行任务。
如果当前运行的线程数等于corePoolsize,就把任务添加到任务队列LinkedBlockingQueue。
如果当前线程池执行完了,就从LinkedBlockingQueue获取任务来执行。 -
SingleThreadPool:是使用单个工作线程来执行任务,适合一些需要保证任务顺序执行的场景。
-
CachedThreadPool。是大小无界的线程池,适合负载比较轻的服务器