SelectedSelectionKeySet 继承AbstractSet抽象类,已经select的NIO SelectionKey集合
final class SelectedSelectionKeySet extends AbstractSet<SelectionKey> {
//Selectionkey数组
SelectionKey[] keys;
//数组可读大小
int size;
SelectedSelectionKeySet() {
keys = new SelectionKey[1024];
}
@Override
public boolean add(SelectionKey o) {
if (o == null) {
return false;
}
//添加到数组
keys[size++] = o;
//超过数组大小上限,进行扩容
if (size == keys.length) {
increaseCapacity();
}
return true;
}
@Override
public boolean remove(Object o) {
return false;
}
@Override
public boolean contains(Object o) {
return false;
}
@Override
public int size() {
return size;
}
@Override
public Iterator<SelectionKey> iterator() {
return new Iterator<SelectionKey>() {
private int idx;
@Override
public boolean hasNext() {
return idx < size;
}
@Override
public SelectionKey next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return keys[idx++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
void reset() {
reset(0);
}
void reset(int start) {
//重置数组内容为空
Arrays.fill(keys, start, size, null);
//重置可读大小为0
size = 0;
}
private void increaseCapacity() {
//两倍扩容
SelectionKey[] newKeys = new SelectionKey[keys.length << 1];
//复制老数组到新数组
System.arraycopy(keys, 0, newKeys, 0, size);
//赋值给老数组
keys = newKeys;
}
}
SelectedSelectionKeySetSelector 基于NettySelectedSelectionKeySet作为selectionKeys的Selector实现类
final class SelectedSelectionKeySetSelector extends Selector {
//SelectedSelectionKeySet对象
private final SelectedSelectionKeySet selectionKeys;
//原始Selector对象
private final Selector delegate;
SelectedSelectionKeySetSelector(Selector delegate, SelectedSelectionKeySet selectionKeys) {
this.delegate = delegate;
this.selectionKeys = selectionKeys;
}
@Override
public boolean isOpen() {
return delegate.isOpen();
}
@Override
public SelectorProvider provider() {
return delegate.provider();
}
@Override
public Set<SelectionKey> keys() {
return delegate.keys();
}
@Override
public Set<SelectionKey> selectedKeys() {
return delegate.selectedKeys();
}
@Override
public int selectNow() throws IOException {
selectionKeys.reset();
return delegate.selectNow();
}
@Override
public int select(long timeout) throws IOException {
//重置selectionKeys
selectionKeys.reset();
return delegate.select(timeout);
}
@Override
public int select() throws IOException {
//重置selectionKeys
selectionKeys.reset();
return delegate.select();
}
@Override
public Selector wakeup() {
return delegate.wakeup();
}
@Override
public void close() throws IOException {
delegate.close();
}
}
NioTask 用来自定义Nio事件处理接口
public interface NioTask<C extends SelectableChannel> {
//处理ChannelIO就绪的事件
void channelReady(C ch, SelectionKey key) throws Exception;
//Channel取消注册
void channelUnregistered(C ch, Throwable cause) throws Exception;
}
ScheduledFutureTask 实现ScheduledFuture、PriorityQueueNode接口,继承PromiseTask抽象类
final class ScheduledFutureTask<V> extends PromiseTask<V> implements ScheduledFuture<V>, PriorityQueueNode {
//定时任务开始时间
private static final long START_TIME = System.nanoTime();
//获得相对时间
static long nanoTime() {
return System.nanoTime() - START_TIME;
}
//获得任务执行时间
static long deadlineNanos(long delay) {
long deadlineNanos = nanoTime() + delay;
return deadlineNanos < 0 ? Long.MAX_VALUE : deadlineNanos;
}
static long initialNanoTime() {
return START_TIME;
}
//任务编号
private long id;
//任务执行时间,到了该时间,任务会被执行
private long deadlineNanos;
//任务执行周期
private final long periodNanos;
//队列编号
private int queueIndex = INDEX_NOT_IN_QUEUE;
ScheduledFutureTask(AbstractScheduledEventExecutor executor,
Runnable runnable, long nanoTime) {
super(executor, runnable);
deadlineNanos = nanoTime;
periodNanos = 0;
}
ScheduledFutureTask(AbstractScheduledEventExecutor executor,
Runnable runnable, long nanoTime, long period) {
super(executor, runnable);
deadlineNanos = nanoTime;
periodNanos = validatePeriod(period);
}
ScheduledFutureTask(AbstractScheduledEventExecutor executor,
Callable<V> callable, long nanoTime, long period) {
super(executor, callable);
deadlineNanos = nanoTime;
periodNanos = validatePeriod(period);
}
ScheduledFutureTask(AbstractScheduledEventExecutor executor,
Callable<V> callable, long nanoTime) {
super(executor, callable);
deadlineNanos = nanoTime;
periodNanos = 0;
}
private static long validatePeriod(long period) {
if (period == 0) {
throw new IllegalArgumentException("period: 0 (expected: != 0)");
}
return period;
}
ScheduledFutureTask<V> setId(long id) {
if (this.id == 0L) {
this.id = id;
}
return this;
}
@Override
protected EventExecutor executor() {
return super.executor();
}
public long deadlineNanos() {
return deadlineNanos;
}
void setConsumed() {
if (periodNanos == 0) {
assert nanoTime() >= deadlineNanos;
deadlineNanos = 0L;
}
}
public long delayNanos() {
return deadlineToDelayNanos(deadlineNanos());
}
static long deadlineToDelayNanos(long deadlineNanos) {
return deadlineNanos == 0L ? 0L : Math.max(0L, deadlineNanos - nanoTime());
}
//距离当前时间,还要多久才执行
public long delayNanos(long currentTimeNanos) {
return deadlineNanos == 0L ? 0L
: Math.max(0L, deadlineNanos() - (currentTimeNanos - START_TIME));
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(delayNanos(), TimeUnit.NANOSECONDS);
}
//用于队列排序,按照deadlineNanos、id属性升序排序
@Override
public int compareTo(Delayed o) {
if (this == o) {
return 0;
}
ScheduledFutureTask<?> that = (ScheduledFutureTask<?>) o;
long d = deadlineNanos() - that.deadlineNanos();
if (d < 0) {
return -1;
} else if (d > 0) {
return 1;
} else if (id < that.id) {
return -1;
} else {
assert id != that.id;
return 1;
}
}
//执行定时任务
@Override
public void run() {
assert executor().inEventLoop();
try {
if (delayNanos() > 0L) {
if (isCancelled()) {
scheduledExecutor().scheduledTaskQueue().removeTyped(this);
} else {
scheduledExecutor().scheduleFromEventLoop(this);
}
return;
}
if (periodNanos == 0) {
//设置任务不可取消
if (setUncancellableInternal()) {
//执行任务
V result = runTask();
//通知任务执行成功
setSuccessInternal(result);
}
} else {
//判断任务并未取消
if (!isCancelled()) {
//执行任务
runTask();
if (!executor().isShutdown()) {
//计算下次执行时间
if (periodNanos > 0) {
deadlineNanos += periodNanos;
} else {
deadlineNanos = nanoTime() - periodNanos;
}
//判断任务并未取消
if (!isCancelled()) {
//重新添加到任务队列,等待下次定时执行
scheduledExecutor().scheduledTaskQueue().add(this);
}
}
}
}
//通知任务执行失败
} catch (Throwable cause) {
setFailureInternal(cause);
}
}
private AbstractScheduledEventExecutor scheduledExecutor() {
return (AbstractScheduledEventExecutor) executor();
}
//取消定时任务
@Override
public boolean cancel(boolean mayInterruptIfRunning) {
boolean canceled = super.cancel(mayInterruptIfRunning);
//取消成功,移除出定时任务队列
if (canceled) {
scheduledExecutor().removeScheduled(this);
}
return canceled;
}
//移除任务
boolean cancelWithoutRemove(boolean mayInterruptIfRunning) {
return super.cancel(mayInterruptIfRunning);
}
@Override
protected StringBuilder toStringBuilder() {
StringBuilder buf = super.toStringBuilder();
buf.setCharAt(buf.length() - 1, ',');
return buf.append(" deadline: ")
.append(deadlineNanos)
.append(", period: ")
.append(periodNanos)
.append(')');
}
@Override
public int priorityQueueIndex(DefaultPriorityQueue<?> queue) {
return queueIndex;
}
@Override
public void priorityQueueIndex(DefaultPriorityQueue<?> queue, int i) {
queueIndex = i;
}
}
AbstractScheduledEventExecutor 支持定时任务的EventExecutor的抽象类
public abstract class AbstractScheduledEventExecutor extends AbstractEventExecutor {
//定时任务排序器
private static final Comparator<ScheduledFutureTask<?>> SCHEDULED_FUTURE_TASK_COMPARATOR =
new Comparator<ScheduledFutureTask<?>>() {
@Override
public int compare(ScheduledFutureTask<?> o1, ScheduledFutureTask<?> o2) {
return o1.compareTo(o2);
}
};
static final Runnable WAKEUP_TASK = new Runnable() {
@Override
public void run() { } // Do nothing
};
//定时任务队列
PriorityQueue<ScheduledFutureTask<?>> scheduledTaskQueue;
long nextTaskId;
protected AbstractScheduledEventExecutor() {
}
protected AbstractScheduledEventExecutor(EventExecutorGroup parent) {
super(parent);
}
//获得当前时间
protected static long nanoTime() {
return ScheduledFutureTask.nanoTime();
}
protected static long deadlineToDelayNanos(long deadlineNanos) {
return ScheduledFutureTask.deadlineToDelayNanos(deadlineNanos);
}
protected static long initialNanoTime() {
return ScheduledFutureTask.initialNanoTime();
}
PriorityQueue<ScheduledFutureTask<?>> scheduledTaskQueue() {
if (scheduledTaskQueue == null) {
scheduledTaskQueue = new DefaultPriorityQueue<ScheduledFutureTask<?>>(
SCHEDULED_FUTURE_TASK_COMPARATOR,11);
}
return scheduledTaskQueue;
}
private static boolean isNullOrEmpty(Queue<ScheduledFutureTask<?>> queue) {
return queue == null || queue.isEmpty();
}
//取消定时任务队列的所有任务
protected void cancelScheduledTasks() {
assert inEventLoop();
//若队列为空,直接返回
PriorityQueue<ScheduledFutureTask<?>> scheduledTaskQueue = this.scheduledTaskQueue;
if (isNullOrEmpty(scheduledTaskQueue)) {
return;
}
final ScheduledFutureTask<?>[] scheduledTasks =
scheduledTaskQueue.toArray(new ScheduledFutureTask<?>[0]);
//循环,取消所有任务
for (ScheduledFutureTask<?> task: scheduledTasks) {
task.cancelWithoutRemove(false);
}
scheduledTaskQueue.clearIgnoringIndexes();
}
//获得指定时间内,定时任务队列首个可执行的任务
protected final Runnable pollScheduledTask() {
return pollScheduledTask(nanoTime());
}
protected final Runnable pollScheduledTask(long nanoTime) {
assert inEventLoop();
//获得队列首个定时任务
ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
if (scheduledTask == null || scheduledTask.deadlineNanos() - nanoTime > 0) {
return null;
}
//移除任务
scheduledTaskQueue.remove();
scheduledTask.setConsumed();
return scheduledTask;
}
//获得定时任务队列,距离当前时间,还要多久可以执行
protected final long nextScheduledTaskNano() {
//获得队列首个定时任务
ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
//距离当前时间,还要多久可执行
return scheduledTask != null ? scheduledTask.delayNanos() : -1;
}
protected final long nextScheduledTaskDeadlineNanos() {
ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
return scheduledTask != null ? scheduledTask.deadlineNanos() : -1;
}
//获得队列首个定时任务,不会从队列中移除该任务
final ScheduledFutureTask<?> peekScheduledTask() {
Queue<ScheduledFutureTask<?>> scheduledTaskQueue = this.scheduledTaskQueue;
return scheduledTaskQueue != null ? scheduledTaskQueue.peek() : null;
}
//判断是否有可执行的定时任务
protected final boolean hasScheduledTasks() {
//获得队列首个定时任务
ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
//判断该任务是否到达可执行的时间
return scheduledTask != null && scheduledTask.deadlineNanos() <= nanoTime();
}
@Override
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
ObjectUtil.checkNotNull(command, "command");
ObjectUtil.checkNotNull(unit, "unit");
if (delay < 0) {
delay = 0;
}
validateScheduled0(delay, unit);
return schedule(new ScheduledFutureTask<Void>(
this,
command,
deadlineNanos(unit.toNanos(delay))));
}
@Override
public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
ObjectUtil.checkNotNull(callable, "callable");
ObjectUtil.checkNotNull(unit, "unit");
if (delay < 0) {
delay = 0;
}
validateScheduled0(delay, unit);
return schedule(new ScheduledFutureTask<V>(this, callable, deadlineNanos(unit.toNanos(delay))));
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
ObjectUtil.checkNotNull(command, "command");
ObjectUtil.checkNotNull(unit, "unit");
if (initialDelay < 0) {
throw new IllegalArgumentException(
String.format("initialDelay: %d (expected: >= 0)", initialDelay));
}
if (period <= 0) {
throw new IllegalArgumentException(
String.format("period: %d (expected: > 0)", period));
}
validateScheduled0(initialDelay, unit);
validateScheduled0(period, unit);
return schedule(new ScheduledFutureTask<Void>(
this, command, deadlineNanos(unit.toNanos(initialDelay)), unit.toNanos(period)));
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
ObjectUtil.checkNotNull(command, "command");
ObjectUtil.checkNotNull(unit, "unit");
if (initialDelay < 0) {
throw new IllegalArgumentException(
String.format("initialDelay: %d (expected: >= 0)", initialDelay));
}
if (delay <= 0) {
throw new IllegalArgumentException(
String.format("delay: %d (expected: > 0)", delay));
}
validateScheduled0(initialDelay, unit);
validateScheduled0(delay, unit);
return schedule(new ScheduledFutureTask<Void>(
this, command, deadlineNanos(unit.toNanos(initialDelay)), -unit.toNanos(delay)));
}
@SuppressWarnings("deprecation")
private void validateScheduled0(long amount, TimeUnit unit) {
validateScheduled(amount, unit);
}
@Deprecated
protected void validateScheduled(long amount, TimeUnit unit) {
// NOOP
}
//添加到定时任务队列
final void scheduleFromEventLoop(final ScheduledFutureTask<?> task) {
scheduledTaskQueue().add(task.setId(++nextTaskId));
}
private <V> ScheduledFuture<V> schedule(final ScheduledFutureTask<V> task) {
if (inEventLoop()) {
//添加到定时任务队列
scheduleFromEventLoop(task);
} else {
//通过EventLoop线程添加到定时任务队列
final long deadlineNanos = task.deadlineNanos();
if (beforeScheduledTaskSubmitted(deadlineNanos)) {
execute(task);
} else {
lazyExecute(task);
if (afterScheduledTaskSubmitted(deadlineNanos)) {
execute(WAKEUP_TASK);
}
}
}
return task;
}
//移除出定时任务队列
final void removeScheduled(final ScheduledFutureTask<?> task) {
assert task.isCancelled();
if (inEventLoop()) {
scheduledTaskQueue().removeTyped(task);
} else {
lazyExecute(task);
}
}
protected boolean beforeScheduledTaskSubmitted(long deadlineNanos) {
return true;
}
protected boolean afterScheduledTaskSubmitted(long deadlineNanos) {
return true;
}
}