美文网首页
Java-多线程-ScheduledThreadPoolExec

Java-多线程-ScheduledThreadPoolExec

作者: 蓝色_笔记本 | 来源:发表于2021-06-11 09:39 被阅读0次

    定时线程池类的类结构图

    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存储等待的任务

    1. DelayQueue内部封装了一个PriorityQueue,它会根据time的先后时间排序,若time相同则根据sequenceNumber排序;
    2. DelayQueue也是一个无界队列;

    相关文章

      网友评论

          本文标题:Java-多线程-ScheduledThreadPoolExec

          本文链接:https://www.haomeiwen.com/subject/dwjueltx.html