Netty執行任務隊列

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章