runAllTasks(ioTime * (100 - ioRatio) / ioRatio);
/**
* 轮询任务队列中的所有任务,并通过{@link Runnable#run()}方法运行它们。此方法停止运行
* 任务队列中的任务,如果运行时间超过{@code timeoutNanos},则返回。
*/
protected boolean runAllTasks(long timeoutNanos) {
//从scheduledTaskQueue转移定时任务到taskQueue
fetchFromScheduledTaskQueue();
Runnable task = pollTask();
if (task == null) {
//尝试在获取一次 如果有就执行
afterRunningAllTasks();
return false;
}
//计算本次任务循环的截止时间
final long deadline = ScheduledFutureTask.nanoTime() + timeoutNanos;
long runTasks = 0;
long lastExecutionTime;
//循环执行任务 到了指定时间 或者 没有任务执行了
for (;;) {
safeExecute(task);
runTasks ++;
// Check timeout every 64 tasks because nanoTime() is relatively expensive.
// XXX: Hard-coded value - will make it configurable if it is really a problem.
if ((runTasks & 0x3F) == 0) {
lastExecutionTime = ScheduledFutureTask.nanoTime();
if (lastExecutionTime >= deadline) {
break;
}
}
task = pollTask();
if (task == null) {
lastExecutionTime = ScheduledFutureTask.nanoTime();
break;
}
}
afterRunningAllTasks();
this.lastExecutionTime = lastExecutionTime;
return true;
}
//将到期的定时任务转移到taskQueue queue里面
private boolean fetchFromScheduledTaskQueue() {
long nanoTime = AbstractScheduledEventExecutor.nanoTime();
Runnable scheduledTask = pollScheduledTask(nanoTime);
while (scheduledTask != null) {
if (!taskQueue.offer(scheduledTask)) {
// 任务队列中没有剩余空间了,将它添加回scheduledTaskQueue,这样我们就可以再次获取它。
scheduledTaskQueue().add((ScheduledFutureTask<?>) scheduledTask);
return false;
}
//从scheduledTaskQueue从拉取一个定时任务的逻辑如下,
// 传入的参数nanoTime为当前时间(其实是当前纳秒减去ScheduledFutureTask类被加载的纳秒个数)
scheduledTask = pollScheduledTask(nanoTime);
}
return true;
}
/**
* 尝试执行给定的{@link Runnable},如果它抛出{@link Throwable},则只记录日志。
*/
protected static void safeExecute(Runnable task) {
try {
task.run();
} catch (Throwable t) {
logger.warn("A task raised an exception. Task: {}", task, t);
}
}
//往taskQueue队列中获取一个任务
protected static Runnable pollTaskFrom(Queue<Runnable> taskQueue) {
for (;;) {
Runnable task = taskQueue.poll();
if (task == WAKEUP_TASK) {
continue;
}
return task;
}
}