1 类继承关系
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