这节课中讲到了`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里的话)
我感觉我还得仔细看看源码好好琢磨琢磨……