java中的ExecutorService主要是围绕Executor,ExecutorService,Runnable,Future,Delayed几个抽象类来展开的。Runnalbe+Future构成了基于返回值的,Runnable+Future+Delay构成了基于时间调度的
1、ExecutorService的类层次设计
2、Future类层次设计
默认实现是FutureTask。run方法是任务的执行体,线程是调用 该方法来具体运行任务的。如果任务没有取消,则该方法会运行任务,并且将结果设置到outcome变量中。
支持的状态有
NEW | 0 |
COMPLETING | 1 |
NORMAL | 2 |
EXCEPTIONAL | 3 |
CANCELLED | 4 |
INTERRUPTING | 5 |
INTERRUPTED | 6 |
执行时如果状态不为NEW或者任务的执行者不为空时直接退出,可以防止同一个FutureTask对象被提交给多个线程来执行,导致run方法被多个线程同时执行造成混乱。在调用call()后,使用set()设置结果时,会将NEW状态更新为COMPLETING,设置成功后,将状态更新为NORMAL,同时调用finishCompletion,激活waiters链表中所有由于等待获取结果而被阻塞的线程,并从waiters链表中移除之它们,等所有由于等待该任务结果的线程被唤醒后,调用don()方法,默认实现是空实现。
get获取结果时,如果当前状态小于等于COMPLETING时,说明任务还没有完成,调用awaitDone挂起调用线程。如果任务已经完成,就调用report上报结果,状态是NORMAL时,返回outcome,状态大于等于CANCELLED,抛出取消异常。
- 如果任务被中断,则从等待链表中移除当前线程对应的节点 ,然后抛出InterruptedException异常。
- 如果当前任务的状态大于COMPLETING,把执行任务的线程的引用设置为null,并且返回结果
- 如果任务状态为COMPLEING,说明任务已经完成,只有结果没有设置到outcome中,这时让当前线程放弃CPU执行,为了让任务执行线程获取到CPU从而将任务状态从COMPLETING转换到状态NORMAL,避免当前调用get系列方法的线程被挂起,然后再被唤醒的开销。
- 在等待时,如果当前q为null,则创建一个与当前线程相关的节点,如果当前线程对应节点还没有放入waiters管理的等待列表,则使用CAS操作放入。
- 如果设置了超时时间则使用LockSupport.parkNanos(this,nacos)让当前线程挂起deadline时间,否则会调用LockSupoot.park(this)让线程一直挂起直到其他线程调用 了unpack方法,
其状态机图为
3、ThreadPoolExecutor中的拒绝策略设计
4、BlockingQueue类层次设计
5、CompletionService类层次设计
6、线程池状态
ctl(AtomicInteger)表示线程池状态,高3位表示运行状态,其余位表示运行的线程数
RUNNING | 111 |
SHUTDOWN | 000 |
STOP | 001 |
TIDYING | 010 |
TERMINATED | 011 |
shutdown()将运行状态设置为SHUTDOWN,不接受新任务并且处理阻塞队列中的任务
shutdownNow()将运行状态设置为STOP,拒绝新任务并且丢弃队列中的任务,同时中断正在处理的任务
TIDYING状态是在所有任务执行完,阻塞队列里也没有任务,当前线程池活动线程数等于0,接着会调用terminated方法
TERMINATED结束状态,在执行完terminated方法后的状态。
7、ThreadPoolExecutor中参数意义
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
corePoolSize:核心线程数,也可以理解为最小线程数
maximumPoolSIze:最大线程数
keepAliveTime:当线程大于核心线程数,空闲线程在结束时等待任务到达的超时时间,对于FixedThreadPool,SingleThreadPool,keepAliveTime为0,表示空闲时立即结束线程,对于CachedThreadPool,keepAliveTime为60s,表示空闲时,60s时间内没有任务时就结束线程
8、Worker
Worker创建时将状态设置为-1,为了防止在执行runWorker时被中断