AbstractScheduledEventExecutor

223 阅读2分钟

1 类继承关系

image.png

2 代码详情

AbstractScheduledEventExecutor

类签名

public abstract class AbstractScheduledEventExecutor extends AbstractEventExecutor

继承自AbstractEventExecutor

为EventExecutor提供定时任务的功能

字段

优先级队列 : PriorityQueue<ScheduledFutureTask<?>> scheduledTaskQueue;

下一个任务id:nextTaskId

共有方法

构造函数:protected AbstractScheduledEventExecutor(EventExecutorGroup parent)

  • super(parent);
  • 调用的父类的AbstractEventExecutor的构造函数,给AbstractEventExecutor的 private final EventExecutorGroup parent;字段赋值

public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)

  • 1 入参校验

  • 2 new一个ScheduledFutureTask出来: ScheduledFutureTask(AbstractScheduledEventExecutor executor, Runnable runnable, long nanoTime)

    • this赋值给DefaultPromise#executor
    • runnable赋值给PromiseTask#task
    • nanoTime赋值给ScheduledFutureTask#deadlineNanos
    • ScheduledFutureTask#periodNanos赋值为0,因为这个不是周期任务
  • 3 判断当前线程是否在eventloop中,如果在优先级队列中则,set ScheduledFutureTask的id字段为++this.nextTaskId,然后把它加入优先级队列中,优先级队列如果有空则new一个DefaultPriorityQueue出来

    • scheduledTaskQueue().add(task.setId(++nextTaskId));
  • 4 如果不在eventloop中

    • (1)获取ScheduledFutureTask的执行时间deadlineNanos
    • (2)调用beforeScheduledTaskSubmitted(deadlineNanos)这个方法的语义是说,在任务提交前的调用,如果return true则表示需要去唤醒eventExecutor线程立即去执行这个定时任务,如果return false,则后续会调用afterScheduledTaskSubmitted去确定是否需要唤醒eventExecutor线程。在AbstractScheduledEventExecutor中这个方法的实现是return true
    • (3) 如果(2)return true则执行java.util.concurrent.Executor#execute方法,目前在AbstractScheduledEventExecutor的环境里面这个方法还没有实现
    • (4)如果(2)return false,则调用AbstractEventExecutor#lazyExecute(Runnable task)这个方法的语义是:它不能保证这个方法会被执行,直到executor被关闭,或者一个non-lazy 的任务被执行,在AbstractScheduledEventExecutor里的实现是调用了java.util.concurrent.Executor#execute
    • (5) 在(4)后执行,调用afterScheduledTaskSubmitted(deadlineNanos),如果return true则直接调用 execute(WAKEUP_TASK);WAKEUP_TASK这个是一个空的Runnable

public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit)和上面一样,只是Runnable变成了Callable

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)也和上面一样,只是这个是周期任务了,会给ScheduledFutureTask对象的periodNanos字段赋值,会赋值成大于0的数

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) 和上面一样,只是这个是固定延迟的定时任务,periodNanos字段的赋值会不一样,会赋值成小于0的数