Executor框架
jdk5开始,把工作单元与执行机制分离开来,工作单元包括Runable和Callable,执行机制由Executor框架来提供。

主要由任务,任务执行和异步计算结果组成
类和接口

使用:
ThreadPoolExecutor:通常使用工厂类Executors创建
FixedThreadPool:创建固定线程数的FixedThreadPool
适用于为了满足资源管理的需求,需要限制当前线程数量的应用场景,适用于负载比较重的服务器
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
SingleThreadExecutor:创建单个线程
适用于需要保证顺序地执行各个任务,并且在任意时间点,不会有多个线程是活动的应用场景
public static ExecutorService newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
CachedThreadPool:创建一个会根据需要创建新线程
大小无界的线程池,适用于执行很多短期异步任务的小程序,或负载教轻的服务器
public static ExecutorService newCachedThreadPool()
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
ScheduledThreadPoolExecutor:通常使用工厂类Executors创建
创建ScheduledThreadPoolExecutor:包含若干线程的ScheduledThreadPoolExecutor
适用于需要多个后台线程执行周期任务,同时为了满足资源管理的需求需要限制后台线程数量的应用场景
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
创建SingleThreadScheduledExecutor:包含一个线程的ScheduledThreadPoolExecutor
适用于需要单个后台线程执行周期任务,同时需要保证顺序地执行各个任务的应用场景
public static ScheduledExecutorService newSingleThreadScheduledExecutor(int corePoolSize)
public static ScheduledExecutorService newSingleThreadScheduledExecutor(int corePoolSize, ThreadFactory threadFactory)
Future接口
Future接口和Future接口的FutureTask类用来表示异步计算的结果
把Runnable接口或Callable接口的实现类提交给ThreadPoolExecutors或ScheduledThreadPoolExecutors时,会返回给一个FutureTask对象
<T> Future<T> submit(Callable<T> task)
<T> Future<T> submit(Runnable task, T result)
Future<> submit(Runnable task)
Runnable接口和Callable接口
Runnable不会返回结果,Callable会返回结果
可以把Runnable包装成Callable
public static Callable可以把Runnable和一个待返回的结果包装成一个Callable
public static Callable callable(Runnable task, T result)
把callable对象提交给执行时,submit会返回一个FutureTask对象
构成组件
创建类型
固定线程数线程池
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads,nThreads, 0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())
}
流程
使用单个worker线程的Executor
public static ExecutorService newSingleThreadExecutor(){
return new ThreadPoolExecutor(1,1, 0L,TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())
}
工作流程
根据需要创建新线程的线程池
public static ExecutorService newCachedThreadPool(int nThreads){
return new ThreadPoolExecutor(0,Integer.MAX_VALUE, 60L,TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>())
}
流程:
主要两部分
ScheduledThreadPoolExecutor为了实现周期性的执行任务,对ThreadPoolExecutor做了如下修改
ScheduledFutureTask成员变量:
DelayQueue封装了一个优先级队列,这个优先级队列会将队列的任务根据time排列,小的在前,如果time相同,比较sequenceNumber,小的在前
ScheduledThreadPoolExecutor执行某个周期任务步骤
Future接口和实现Future接口的FutureTask类,代表异步计算的结果
当一个线程需要等待另一个线程把某个任务执行完后才能执行,此时可以使用FutureTask
基于AQS实现,包含两种类型操作
Sync是FutureTask的内部私有类,继承自AQS,FutureTask的所有公有方法都直接委托给了内部私有Sync
FutureTask.get方法会用AQS的acquireSharedInterruptibly方法,执行过程
FutureTask.run方法