ExecutorService框架

java中的ExecutorService主要是围绕Executor,ExecutorService,Runnable,Future,Delayed几个抽象类来展开的。Runnalbe+Future构成了基于返回值的,Runnable+Future+Delay构成了基于时间调度的

1、ExecutorService的类层次设计 

2、Future类层次设计 

默认实现是FutureTask。run方法是任务的执行体,线程是调用 该方法来具体运行任务的。如果任务没有取消,则该方法会运行任务,并且将结果设置到outcome变量中。

支持的状态有

NEW0
COMPLETING1
NORMAL2
EXCEPTIONAL3
CANCELLED4
INTERRUPTING5
INTERRUPTED6

执行时如果状态不为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位表示运行状态,其余位表示运行的线程数

RUNNING111
SHUTDOWN000
STOP001
TIDYING010
TERMINATED011

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时被中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值