美文网首页
runAllTasks()

runAllTasks()

作者: JIU_LV | 来源:发表于2018-12-08 22:41 被阅读0次

    runAllTasks()

     /**
         * Poll all tasks from the task queue and run them via {@link Runnable#run()} method.  This method stops running
         * the tasks in the task queue and returns if it ran longer than {@code timeoutNanos}.
         */
        protected boolean runAllTasks(long timeoutNanos) {
            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;
        }
    
    

    fetchFromScheduledTaskQueue()

    rivate boolean fetchFromScheduledTaskQueue() {
            long nanoTime = AbstractScheduledEventExecutor.nanoTime();
            Runnable scheduledTask  = pollScheduledTask(nanoTime);
            while (scheduledTask != null) {
                if (!taskQueue.offer(scheduledTask)) {
                    // No space left in the task queue add it back to the scheduledTaskQueue so we pick it up again.
                    scheduledTaskQueue().add((ScheduledFutureTask<?>) scheduledTask);
                    return false;
                }
                scheduledTask  = pollScheduledTask(nanoTime);
            }
            return true;
        }
    

    pollScheduledTask()

     /**
         * Return the {@link Runnable} which is ready to be executed with the given {@code nanoTime}.
         * You should use {@link #nanoTime()} to retrieve the the correct {@code nanoTime}.
         */
        protected final Runnable pollScheduledTask(long nanoTime) {
            assert inEventLoop();
    
            Queue<ScheduledFutureTask<?>> scheduledTaskQueue = this.scheduledTaskQueue;
            ScheduledFutureTask<?> scheduledTask = scheduledTaskQueue == null ? null : scheduledTaskQueue.peek();
            if (scheduledTask == null) {
                return null;
            }
    
            if (scheduledTask.deadlineNanos() <= nanoTime) {
                scheduledTaskQueue.remove();
                return scheduledTask;
            }
            return null;
        }
    
        protected Runnable pollTask() {
            assert inEventLoop();
            return pollTaskFrom(taskQueue);
        }
    
    
        protected static Runnable pollTaskFrom(Queue<Runnable> taskQueue) {
            for (;;) {
                Runnable task = taskQueue.poll();
                if (task == WAKEUP_TASK) {
                    continue;
                }
                return task;
            }
        }
     /**
         * Try to execute the given {@link Runnable} and just log if it throws a {@link Throwable}.
         */
        protected static void safeExecute(Runnable task) {
            try {
                task.run();
            } catch (Throwable t) {
                logger.warn("A task raised an exception. Task: {}", task, t);
            }
        }
    
    @Override
        protected void afterRunningAllTasks() {
            runAllTasksFrom(tailTasks);
        }
    
    
    /**
         * Runs all tasks from the passed {@code taskQueue}.
         *
         * @param taskQueue To poll and execute all tasks.
         *
         * @return {@code true} if at least one task was executed.
         */
        protected final boolean runAllTasksFrom(Queue<Runnable> taskQueue) {
            Runnable task = pollTaskFrom(taskQueue);
            if (task == null) {
                return false;
            }
            for (;;) {
                safeExecute(task);
                task = pollTaskFrom(taskQueue);
                if (task == null) {
                    return true;
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:runAllTasks()

          本文链接:https://www.haomeiwen.com/subject/nsbchqtx.html