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;
}
}