定时线程池类的类结构图
image.png一、条件锁
条件锁框架中对应的AQS框架中,条件队列与同步队列都用了起来。
1、T1刚来,抢占独占锁成功,T1进入NotFull条件队列,执行业务,业务完成。判断Full队列是否满足T1继续执行的条件,若不满足,阻塞线程(LockSupport.park())。
2、T2刚来,抢占独占锁成功,T2进入NotEmpty条件队列,判断NotFull队列是否满足T2执行的条件,若满足,执行业务,若不满足,阻塞线程,通知NotFull条件队列线程。NotFull条件队列把头一个线程T1转移到同步CLH队列中。
3、新的线程T1加入同步CLH队列后,唤醒队列前面线程T1(LockSupport.unpark())。
注意:条件锁中会同时存在条件队列与同步队列,但条件队列中的线程没有办法被唤醒,只有把线程转移到同步队列中才能被唤醒,才能有机会获取独占锁。
二、ScheduledThreadPoolExecutor使用
ScheduledThreadPoolExecutor框架是ThreadPoolExecutor框架的一个拓展。但ScheduledThreadPoolExecutor在添加线程任务的时候,会直接把线程任务添加到队列中。
它接收SchduledFutureTask类型的任务,是线程池调度任务的最小单位,有三种提交任务的方式:
1、schedule(Runnable run, int postpone, TimeUnit unit),延期执行,只执行一次。
2、scheduledAtFixedRate(Runnable run, int postpone, int cycTime,TimeUnit unit),延期执行,重复执行,不管线程执行时间多长,每隔cycTime时间产生一个新的任务放入队列中。
3、scheduledWithFixedDelay(Runnable run, int postpone, int cycTime,TimeUnit unit),延期执行,重复执行,每线程执行时间+cycTime时间产生一个新的任务放入队列中。
它采用DelayQueue存储等待的任务
- DelayQueue内部封装了一个PriorityQueue,它会根据time的先后时间排序,若time相同则根据sequenceNumber排序;
- DelayQueue也是一个无界队列;
网友评论