Excutor框架
JDK1.5开始,开始将工作单元和工作机制分离开来,工作单元就是Runnable和Callable这种,
而具体工作由Excutor具体提供
在hotspot vm的线程模型中,用户线程和内核线程是一对一的
Excutor可以分为两个部分,一个是架构一个是其包含的组件
Excutor的结构
1.任务:执行的任务需要实现的接口:Runnable(无返回值)和Callable(有返回值)
2.任务的执行:任务执行的core interface:Excutor接口,以及继承于这个接口的ExcutorService接口。
ExcutorService接口有两个非常重要的实现类,ThreadPoolExcutor和ScheduleThreadPoolExcutor
3.异步计算的结果:包括接口Future和实现接口Future的FutureTask类
Executor框架的成员:
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
- Future接口
- Runnable接口和Callable接口
Runnable、Callable、Future、RunnableFuture、FutureTask、CompletableFuture:

Runnable:只有一个void run()方法,Thread实现了这个接口,所以创建Thread的时候实现这个接口,然后thread.start()就能创建一个线程执行run(),或者往Thread构造方法中传入Runnable的一个实现类。
Callable:有返回值的call()方法
Future:接口,异步获取任务结果
RunnableFuture:接口,其实就相当于异步的Runnable
**FutureTask:RunnableFuture的实现类。内部其实内聚了一个Callable,即使你用第二个构造方法传入Runnable,也会包装成Callable!所以其实就相当于异步的Runnable和Callable(适配器模式),里面的run方法就是执行Callable的call()!其线程安全通过CAS保证 **
CompletableFuture:实现了Future接口,提供了许多更为强大的功能,使用:Java CompletableFuture
ScheduleThreadPoolExcutor
构造方法和普通线程池一样,或者使用Executors.newScheduledThreadPool(int coreSize)
核心方法:
延迟执行一次:schedule(Runnable command, long delay,TimeUnit unit)
固定频率执行:scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit),首次在initialDelay后执行,之后每隔period时间执行一次。如果任务时间超过周期,会等待上次执行完毕
固定延迟执行:scheduleWithFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit),和上面类似,但每次计算是上次任务结束后开始计算延迟
