这节课中讲到了`io.netty.util.concurrent.AbstractScheduledEventExecutor`的`schedule
()`方法
Queue<ScheduledFutureTask<?>> scheduledTaskQueue;
Queue<ScheduledFutureTask<?>> scheduledTaskQueue() {
if (scheduledTaskQueue == null) {
scheduledTaskQueue = new PriorityQueue<ScheduledFutureTask<?>>();
}
return scheduledTaskQueue;
}
<V> ScheduledFuture<V> schedule(final ScheduledFutureTask<V> task) {
if (inEventLoop()) {
scheduledTaskQueue().add(task);
} else {
execute(new Runnable() {
@Override
public void run() {
scheduledTaskQueue().add(task);
}
});
}
return task;
}scheduledTaskQueue() -> 我理解为: 延迟创建 成员变量 scheduledTaskQueue
inEventLoop() -> 如果是在同一Thread,就直接向成员变量中添加数据;否则,在一个新的Thread中添加, 这不会造成问题吗?
在什么条件下会出现 - 不是同一个线程的情况?
在 else 下, scheduledTaskQueue 重新初始化了一次吗? 否则怎么保证安全啊?
有点方,没转过弯来,请各位道友帮帮忙……
****
感谢 @鋒Nic 的回答,不过答案太长了也没分段看得我头疼。
我看到一句非常有价值的话是: 「外部线程发起的schedule的定时任务不应该去阻塞io事件的处理」 那是否是说进入到 else 的情形就是 那些会阻塞io事件的用户事件(我描述的不好,不知怎么描述)。
我一直觉得 成员变量 scheduledTaskQueue 会随着这个类一起被重新创建多次 (如果进入到else里的话)
我感觉我还得仔细看看源码好好琢磨琢磨……