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),和上面类似,但每次计算是上次任务结束后开始计算延迟