Netty组件源码解析(2)

【Netty】Netty时间轮实践与源码解析 阅读详情

三.EventLoop

类图
在这里插入图片描述
EventExecutor 继承EventExecutorGroup接口,事件执行器接口

public interface EventExecutor extends EventExecutorGroup {
	//返回自己
    @Override
    EventExecutor next();
	//当前线程所处的EventExecutorGroup
    EventExecutorGroup parent();
	//当前线程是否在EventLoop线程中
    boolean inEventLoop();
	//指定线程是否是EventLoop线程
    boolean inEventLoop(Thread thread);
	//创建一个Promise对象
    <V> Promise<V> newPromise();
	//创建一个ProgressivePromise对象
    <V> ProgressivePromise<V> newProgressivePromise();
	//创建成功结果的Future对象
    <V> Future<V> newSucceededFuture(V result);
	//创建异常的Future对象
    <V> Future<V> newFailedFuture(Throwable cause);
}

OrderedEventExecutor 有序的事件执行器接口

//表示该执行器会有序/串行的方式执行
public interface OrderedEventExecutor extends EventExecutor {
}

EventLoop

public interface EventLoop extends OrderedEventExecutor, EventLoopGroup {
    @Override
    //覆写方法的返回类型为 EventLoopGroup
    EventLoopGroup parent();
}

AbstractEventExecutor

public abstract class AbstractEventExecutor extends AbstractExecutorService implements EventExecutor {
    private static final InternalLogger logger = InternalLoggerFactory.getInstance(AbstractEventExecutor.class);

    static final long DEFAULT_SHUTDOWN_QUIET_PERIOD = 2;
    static final long DEFAULT_SHUTDOWN_TIMEOUT = 15;
	//所属的EventExecutorGroup
    private final EventExecutorGroup parent;
    //EventExecutor数组,只包含自己
    private final Collection<EventExecutor> selfCollection = Collections.<EventExecutor>singleton(this);

    protected AbstractEventExecutor() {
        this(null);
    }

    protected AbstractEventExecutor(EventExecutorGroup parent) {
        this.parent = parent;
    }
	//获得所属的EventExecutorGroup
    @Override
    public EventExecutorGroup parent() {
        return parent;
    }
	//获得自己
    @Override
    public EventExecutor next() {
        return this;
    }
	//判断当前线程是否在EventLoop线程中
    @Override
    public boolean inEventLoop() {
        return inEventLoop(Thread.currentThread());
    }

    @Override
    public Iterator<EventExecutor> iterator() {
        return selfCollection.iterator();
    }

    @Override
    public Future<?> shutdownGracefully() {
        return shutdownGracefully(DEFAULT_SHUTDOWN_QUIET_PERIOD, DEFAULT_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS);
    }
//关闭执行器
    @Override
    @Deprecated
    public abstract void shutdown();

    @Override
    @Deprecated
    public List<Runnable> shutdownNow() {
        shutdown();
        return Collections.emptyList();
    }

    @Override
    public <V> Promise<V> newPromise() {
        return new DefaultPromise<V>(this);
    }

    @Override
    public <V> ProgressivePromise<V> newProgressivePromise() {
        return new DefaultProgressivePromise<V>(this);
    }
	//创建成功结果
    @Override
    public <V> Future<V> newSucceededFuture(V result) {
        return new SucceededFuture<V>(this, result);
    }
	//创建异常的Future对象
    @Override
    public <V> Future<V> newFailedFuture(Throwable cause) {
        return new FailedFuture<V>(this, cause);
    }
//提交任务
    @Override
    public Future<?> submit(Runnable task) {
        return (Future<?>) super.submit(task);
    }

    @Override
    public <T> Future<T> submit(Runnable task, T result) {
        return (Future<T>) super.submit(task, result);
    }

    @Override
    public <T> Future<T> submit(Callable<T> task) {
        return (Future<T>) super.submit(task);
    }
	//创建PromiseTask对象
    @Override
    protected final <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
        return new PromiseTask<T>(this, runnable, value);
    }

    @Override
    protected final <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
        return new PromiseTask<T>(this, callable);
    }

    @Override
    public ScheduledFuture<?> schedule(Runnable command, long delay,
                                       TimeUnit unit) {
        throw new UnsupportedOperationException();
    }

    @Override
    public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) {
        throw new UnsupportedOperationException();
    }

    @Override
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
        throw new UnsupportedOperationException();
    }

    @Override
    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
        throw new UnsupportedOperationException();
    }
//安全的执行任务
    protected static void safeExecute(Runnable task) {
        try {
            task.run();
        } catch (Throwable t) {
        //发生异常的时候打印警告日志
            logger.warn("A task raised an exception. Task: {}", task, t);
        }
    }

    @UnstableApi
    public void lazyExecute(Runnable task) {
        execute(task);
    }

    @UnstableApi
    public interface LazyRunnable extends Runnable { }
}

SingleThreadEventExecutor 基于单线程的 EventExecutor 抽象类,即一个EventExecutor对应一个线程

public abstract class SingleThreadEventExecutor extends AbstractScheduledEventExecutor implements OrderedEventExecutor {

    static final int DEFAULT_MAX_PENDING_EXECUTOR_TASKS = Math.max(16,
            SystemPropertyUtil.getInt("io.netty.eventexecutor.maxPendingTasks", Integer.MAX_VALUE));

    private static final InternalLogger logger =
            InternalLoggerFactory.getInstance(SingleThreadEventExecutor.class);
	//未开始
    private static final int ST_NOT_STARTED = 1;
    //已开始
    private static final int ST_STARTED = 2;
    //正在关闭中
    private static final int ST_SHUTTING_DOWN = 3;
    //已关闭
    private static final int ST_SHUTDOWN = 4;
    //已经终止
    private static final int ST_TERMINATED = 5;

    private static final Runnable NOOP_TASK = new Runnable() {
        @Override
        public void run() {
            // Do nothing.
        }
    };
//state字段的原子更新器
    private static final AtomicIntegerFieldUpdater<SingleThreadEventExecutor> STATE_UPDATER =
            AtomicIntegerFieldUpdater.newUpdater(SingleThreadEventExecutor.class, "state");
//thread字段的原子更新器
    private static final AtomicReferenceFieldUpdater<SingleThreadEventExecutor, ThreadProperties> PROPERTIES_UPDATER =
            AtomicReferenceFieldUpdater.newUpdater(
                    SingleThreadEventExecutor.class, ThreadProperties.class, "threadProperties");
//任务队列
    private final Queue<Runnable> taskQueue;
//线程
    private volatile Thread thread;
    //线程属性
    @SuppressWarnings("unused")
    private volatile ThreadProperties threadProperties;
    //执行器
    private final Executor executor;
    //线程是否已经打断
    private volatile boolean interrupted;
	//线程锁
    private final CountDownLatch threadLock = new CountDownLatch(1);
    private final Set<Runnable> shutdownHooks = new LinkedHashSet<Runnable>();
    //添加任务时,是否唤醒线程
    private final boolean addTaskWakesUp;
    //最大等待执行任务数量
    private final int maxPendingTasks;
    //拒绝执行处理器
    private final RejectedExecutionHandler rejectedExecutionHandler;
	//最后执行时间
    private long lastExecutionTime;
	//状态
    @SuppressWarnings({ "FieldMayBeFinal", "unused" })
    private volatile int state = ST_NOT_STARTED;

    private volatile long gracefulShutdownQuietPeriod;
    //优雅关闭超时时间
    private volatile long gracefulShutdownTimeout;
    //优雅关闭开始时间
    private long gracefulShutdownStartTime;

    private final Promise<?> terminationFuture = new DefaultPromise<Void>(GlobalEventExecutor.INSTANCE);

    protected SingleThreadEventExecutor(
            EventExecutorGroup parent, ThreadFactory threadFactory, boolean addTaskWakesUp) {
        this(parent, new ThreadPerTaskExecutor(threadFactory), addTaskWakesUp);
    }

    protected SingleThreadEventExecutor(
            EventExecutorGroup parent, ThreadFactory threadFactory,
            boolean addTaskWakesUp, int maxPendingTasks, RejectedExecutionHandler rejectedHandler) {
        this(parent, new ThreadPerTaskExecutor(threadFactory), addTaskWakesUp, maxPendingTasks, rejectedHandler);
    }

    protected SingleThreadEventExecutor(EventExecutorGroup parent, Executor executor, boolean addTaskWakesUp) {
        this(parent, executor, addTaskWakesUp, DEFAULT_MAX_PENDING_EXECUTOR_TASKS, RejectedExecutionHandlers.reject());
    }

    protected SingleThreadEventExecutor(EventExecutorGroup parent, Executor executor,
                                        boolean addTaskWakesUp, int maxPendingTasks,
                                        RejectedExecutionHandler rejectedHandler) {
        super(parent);
        this.addTaskWakesUp = addTaskWakesUp;
        this.maxPendingTasks = Math.max(16, maxPendingTasks);
        this.executor = ThreadExecutorMap.apply(executor, this);
        taskQueue = newTaskQueue(this.maxPendingTasks);
        rejectedExecutionHandler = ObjectUtil.checkNotNull(rejectedHandler, "rejectedHandler");
    }

    protected SingleThreadEventExecutor(EventExecutorGroup parent, Executor executor,
                                        boolean addTaskWakesUp, Queue<Runnable> taskQueue,
                                        RejectedExecutionHandler rejectedHandler) {
        super(parent);
        this.addTaskWakesUp = addTaskWakesUp;
        this.maxPendingTasks = DEFAULT_MAX_PENDING_EXECUTOR_TASKS;
        this.executor = ThreadExecutorMap.apply(executor, this);
        this.taskQueue = ObjectUtil.checkNotNull(taskQueue, "taskQueue");
        this.rejectedExecutionHandler = ObjectUtil.checkNotNull(rejectedHandler, "rejectedHandler");
    }
	//创建任务队列
    @Deprecated
    protected Queue<Runnable> newTaskQueue() {
        return newTaskQueue(maxPendingTasks);
    }
    protected Queue<Runnable> newTaskQueue(int maxPendingTasks) {
        return new LinkedBlockingQueue<Runnable>(maxPendingTasks);
    }
	//打断线程
    protected void interruptThread() {
        Thread currentThread = thread;
        //线程不存在,则标记线程被打断
        if (currentThread == null) {
            interrupted = true;
        } else {
        //打断线程
            currentThread.interrupt();
        }
    }
	//获得队头的任务
    protected Runnable pollTask() {
        assert inEventLoop();
        return pollTaskFrom(taskQueue);
    }

    protected static Runnable pollTaskFrom(Queue<Runnable> taskQueue) {
        for (;;) {
        //获得并且移除队首元素,如果获得不到,返回Null
            Runnable task = taskQueue.poll();
             // 忽略 WAKEUP_TASK 任务,因为是空任务
            if (task != WAKEUP_TASK) {
                return task;
            }
        }
    }

    protected Runnable takeTask() {
        assert inEventLoop();
        if (!(taskQueue instanceof BlockingQueue)) {
            throw new UnsupportedOperationException();
        }

        BlockingQueue<Runnable> taskQueue = (BlockingQueue<Runnable>) this.taskQueue;
        for (;;) {
            ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
            if (scheduledTask == null) {
                Runnable task = null;
                try {
                    task = taskQueue.take();
                    if (task == WAKEUP_TASK) {
                        task = null;
                    }
                } catch (InterruptedException e) {
                    // Ignore
                }
                return task;
            } else {
                long delayNanos = scheduledTask.delayNanos();
                Runnable task = null;
                if (delayNanos > 0) {
                    try {
                        task = taskQueue.poll(delayNanos, TimeUnit.NANOSECONDS);
                    } catch (InterruptedException e) {
                        // Waken up.
                        return null;
                    }
                }
                if (task == null) {
                    fetchFromScheduledTaskQueue();
                    task = taskQueue.poll();
                }

                if (task != null) {
                    return task;
                }
            }
        }
    }
	//将定时任务队列到达可执行的任务,添加到任务队列中
    private boolean fetchFromScheduledTaskQueue() {
        if (scheduledTaskQueue == null || scheduledTaskQueue.isEmpty()) {
            return true;
        }
        //获得当前时间
        long nanoTime = AbstractScheduledEventExecutor.nanoTime();
        for (;;) {
        //获得当前时间内,定时任务队列首个可执行的任务,并且从队列中移除
            Runnable scheduledTask = pollScheduledTask(nanoTime);
            if (scheduledTask == null) {
                return true;
            }
            //将定时任务添加到taskQueue
            if (!taskQueue.offer(scheduledTask)) {
            //将定时任务添加回scheduledTaskQueue中
                scheduledTaskQueue.add((ScheduledFutureTask<?>) scheduledTask);
                return false;
            }
        }
    }


    private boolean executeExpiredScheduledTasks() {
        if (scheduledTaskQueue == null || scheduledTaskQueue.isEmpty()) {
            return false;
        }
        long nanoTime = AbstractScheduledEventExecutor.nanoTime();
        Runnable scheduledTask = pollScheduledTask(nanoTime);
        if (scheduledTask == null) {
            return false;
        }
        do {
            safeExecute(scheduledTask);
        } while ((scheduledTask = pollScheduledTask(nanoTime)) != null);
        return true;
    }

    //返回队头的任务,但是不移除
    protected Runnable peekTask() {
        assert inEventLoop();
        return taskQueue.peek();
    }

    //队列中是否有任务
    protected boolean hasTasks() {
        assert inEventLoop();
        return !taskQueue.isEmpty();
    }

    //获得队列中的任务数
    public int pendingTasks() {
        return taskQueue.size();
    }

    //在offerTask的基础上,如果添加任务到队列中失败,则进行拒绝任务
    protected void addTask(Runnable task) {
        ObjectUtil.checkNotNull(task, "task");
        //添加任务到队列
        if (!offerTask(task)) {
        //添加失败,就拒绝任务
            reject(task);
        }
    }
	//添加任务到任务队列中,如果添加失败就返回false
    final boolean offerTask(Runnable task) {
        if (isShutdown()) {
            reject();
        }
        //添加任务到队列
        return taskQueue.offer(task);
    }
	//移除指定任务
    protected boolean removeTask(Runnable task) {
        return taskQueue.remove(ObjectUtil.checkNotNull(task, "task"));
    }
	//执行所有任务直到完成所有
    protected boolean runAllTasks() {
        assert inEventLoop();
        boolean fetchedAll;
        //是否执行过任务
        boolean ranAtLeastOne = false;

        do {
        //从定时任务获得到时间的任务
            fetchedAll = fetchFromScheduledTaskQueue();
            //执行任务队列中的所有任务
            if (runAllTasksFrom(taskQueue)) {
            //若有任务执行,则标记为true
                ranAtLeastOne = true;
            }
        } while (!fetchedAll); // keep on processing until we fetched all scheduled tasks.
		//如果执行过任务,则设置最后执行时间
        if (ranAtLeastOne) {
            lastExecutionTime = ScheduledFutureTask.nanoTime();
        }
        //执行所有任务完成的后续方法
        afterRunningAllTasks();
        return ranAtLeastOne;
    }

    protected final boolean runScheduledAndExecutorTasks(final int maxDrainAttempts) {
        assert inEventLoop();
        boolean ranAtLeastOneTask;
        int drainAttempt = 0;
        do {
            // We must run the taskQueue tasks first, because the scheduled tasks from outside the EventLoop are queued
            // here because the taskQueue is thread safe and the scheduledTaskQueue is not thread safe.
            ranAtLeastOneTask = runExistingTasksFrom(taskQueue) | executeExpiredScheduledTasks();
        } while (ranAtLeastOneTask && ++drainAttempt < maxDrainAttempts);

        if (drainAttempt > 0) {
            lastExecutionTime = ScheduledFutureTask.nanoTime();
        }
        afterRunningAllTasks();

        return drainAttempt > 0;
    }
	//执行任务队列中的所有任务
    protected final boolean runAllTasksFrom(Queue<Runnable> taskQueue) {
    //获得队头的任务
        Runnable task = pollTaskFrom(taskQueue);
        //获取不到就返回false
        if (task == null) {
            return false;
        }
        for (;;) {
        //执行任务
            safeExecute(task);
            //获得队头的任务
            task = pollTaskFrom(taskQueue);
            //获取不到,结束执行,返回true
            if (task == null) {
                return true;
            }
        }
    }

    private boolean runExistingTasksFrom(Queue<Runnable> taskQueue) {
        Runnable task = pollTaskFrom(taskQueue);
        if (task == null) {
            return false;
        }
        int remaining = Math.min(maxPendingTasks, taskQueue.size());
        safeExecute(task);
        // Use taskQueue.poll() directly rather than pollTaskFrom() since the latter may
        // silently consume more than one item from the queue (skips over WAKEUP_TASK instances)
        while (remaining-- > 0 && (task = taskQueue.poll()) != null) {
            safeExecute(task);
        }
        return true;
    }
	//执行所有任务直到完成所有,或者超过执行时间上限
    protected boolean runAllTasks(long timeoutNanos) {
    //从定时任务获得到时间的任务
        fetchFromScheduledTaskQueue();
        //获得队头的任务
        Runnable task = pollTask();
        //获取不到,结束执行 
        if (task == null) {
        //执行所有任务完成的后续方法
            afterRunningAllTasks();
            return false;
        }
		//计算执行任务截止时间
        final long deadline = timeoutNanos > 0 ? ScheduledFutureTask.nanoTime() + timeoutNanos : 0;
        //执行任务计数
        long runTasks = 0;
        long lastExecutionTime;
        //循环执行任务
        for (;;) {
        //执行任务
            safeExecute(task);
			//计数+1
            runTasks ++;
            //每隔64个任务检查一次时间
            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;
    }

    @UnstableApi
    protected void afterRunningAllTasks() { }

    protected long delayNanos(long currentTimeNanos) {
        ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
        if (scheduledTask == null) {
            return SCHEDULE_PURGE_INTERVAL;
        }

        return scheduledTask.delayNanos(currentTimeNanos);
    }

    @UnstableApi
    protected long deadlineNanos() {
        ScheduledFutureTask<?> scheduledTask = peekScheduledTask();
        if (scheduledTask == null) {
            return nanoTime() + SCHEDULE_PURGE_INTERVAL;
        }
        return scheduledTask.deadlineNanos();
    }

    protected void updateLastExecutionTime() {
        lastExecutionTime = ScheduledFutureTask.nanoTime();
    }

    protected abstract void run();

    protected void cleanup() {
        // NOOP
    }
	//唤醒线程
    protected void wakeup(boolean inEventLoop) {
        if (!inEventLoop) {
            taskQueue.offer(WAKEUP_TASK);
        }
    }
	//判断指定线程是否是EventLoop线程
    @Override
    public boolean inEventLoop(Thread thread) {
        return thread == this.thread;
    }

    public void addShutdownHook(final Runnable task) {
        if (inEventLoop()) {
            shutdownHooks.add(task);
        } else {
            execute(new Runnable() {
                @Override
                public void run() {
                    shutdownHooks.add(task);
                }
            });
        }
    }

    public void removeShutdownHook(final Runnable task) {
        if (inEventLoop()) {
            shutdownHooks.remove(task);
        } else {
            execute(new Runnable() {
                @Override
                public void run() {
                    shutdownHooks.remove(task);
                }
            });
        }
    }

    private boolean runShutdownHooks() {
        boolean ran = false
        while (!shutdownHooks.isEmpty()) {
        //拷贝shutdownHook任务
            List<Runnable> copy = new ArrayList<Runnable>(shutdownHooks);
            shutdownHooks.clear();
            for (Runnable task: copy) {
                try {
                    task.run();
                } catch (Throwable t) {
                    logger.warn("Shutdown hook raised an exception.", t);
                } finally {
                    ran = true;
                }
            }
        }

        if (ran) {
            lastExecutionTime = ScheduledFutureTask.nanoTime();
        }

        return ran;
    }
	//优雅关闭
    @Override
    public Future<?> shutdownGracefully(long quietPeriod, long timeout, TimeUnit unit) {
        ObjectUtil.checkPositiveOrZero(quietPeriod, "quietPeriod");
        if (timeout < quietPeriod) {
            throw new IllegalArgumentException(
                    "timeout: " + timeout + " (expected >= quietPeriod (" + quietPeriod + "))");
        }
        ObjectUtil.checkNotNull(unit, "unit");
		//正在关闭阻止其他线程
        if (isShuttingDown()) {
            return terminationFuture();
        }

        boolean inEventLoop = inEventLoop();
        boolean wakeup;
        int oldState;
        for (;;) {
            if (isShuttingDown()) {
            //正在关闭阻止其他线程
                return terminationFuture();
            }
            int newState;
            wakeup = true;
            oldState = state;
            if (inEventLoop) {
                newState = ST_SHUTTING_DOWN;
            } else {
                switch (oldState) {
                    case ST_NOT_STARTED:
                    case ST_STARTED:
                        newState = ST_SHUTTING_DOWN;
                        break;
                    default:
                    //线程修改好线程状态
                        newState = oldState;
                        wakeup = false;
                }
            }
            if (STATE_UPDATER.compareAndSet(this, oldState, newState)) {
            //保证只有一个线程将oldState修改成newState
                break;
            }
        }
        //在default情况下更新这两个值
        gracefulShutdownQuietPeriod = unit.toNanos(quietPeriod);
        gracefulShutdownTimeout = unit.toNanos(timeout);

        if (ensureThreadStarted(oldState)) {
            return terminationFuture;
        }

        if (wakeup) {
            taskQueue.offer(WAKEUP_TASK);
            if (!addTaskWakesUp) {
                wakeup(inEventLoop);
            }
        }

        return terminationFuture();
    }

    @Override
    public Future<?> terminationFuture() {
        return terminationFuture;
    }

    @Override
    @Deprecated
    public void shutdown() {
        if (isShutdown()) {
            return;
        }

        boolean inEventLoop = inEventLoop();
        boolean wakeup;
        int oldState;
        for (;;) {
            if (isShuttingDown()) {
                return;
            }
            int newState;
            wakeup = true;
            oldState = state;
            if (inEventLoop) {
                newState = ST_SHUTDOWN;
            } else {
                switch (oldState) {
                    case ST_NOT_STARTED:
                    case ST_STARTED:
                    case ST_SHUTTING_DOWN:
                        newState = ST_SHUTDOWN;
                        break;
                    default:
                        newState = oldState;
                        wakeup = false;
                }
            }
            if (STATE_UPDATER.compareAndSet(this, oldState, newState)) {
                break;
            }
        }

        if (ensureThreadStarted(oldState)) {
            return;
        }

        if (wakeup) {
            taskQueue.offer(WAKEUP_TASK);
            if (!addTaskWakesUp) {
                wakeup(inEventLoop);
            }
        }
    }

    @Override
    public boolean isShuttingDown() {
        return state >= ST_SHUTTING_DOWN;
    }
	//将线程状态设置为关闭
    @Override
    public boolean isShutdown() {
        return state >= ST_SHUTDOWN;
    }

    @Override
    public boolean isTerminated() {
        return state == ST_TERMINATED;
    }

    /**
     * Confirm that the shutdown if the instance should be done now!
     */
    protected boolean confirmShutdown() {
    //没有调用shutdown相关的方法直接返回
        if (!isShuttingDown()) {
            return false;
        }

        if (!inEventLoop()) {
            throw new IllegalStateException("must be invoked from an event loop");
        }
		//取消调度任务
        cancelScheduledTasks();
		//优雅关闭开始时间
        if (gracefulShutdownStartTime == 0) {
            gracefulShutdownStartTime = ScheduledFutureTask.nanoTime();
        }
		//执行完普通任务或者没有普通任务时执行完shutdownHook任务
        if (runAllTasks() || runShutdownHooks()) {
            if (isShutdown()) {
            //调用shutdown方法直接退出
                return true;
            }
            if (gracefulShutdownQuietPeriod == 0) {
            //优雅关闭静默时间为0也直接退出
                return true;
            }
            //优雅关闭但有未执行任务,唤醒线程执行
            taskQueue.offer(WAKEUP_TASK);
            return false;
        }

        final long nanoTime = ScheduledFutureTask.nanoTime();
		//优雅关闭截止时间也返回
        if (isShutdown() || nanoTime - gracefulShutdownStartTime > gracefulShutdownTimeout) {
            return true;
        }
		//在静默期间每100ms唤醒线程执行期间提交的任务
        if (nanoTime - lastExecutionTime <= gracefulShutdownQuietPeriod) {
            taskQueue.offer(WAKEUP_TASK);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // Ignore
            }

            return false;
        }
        return true;
    }

    @Override
    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
        ObjectUtil.checkNotNull(unit, "unit");
        if (inEventLoop()) {
            throw new IllegalStateException("cannot await termination of the current thread");
        }

        threadLock.await(timeout, unit);

        return isTerminated();
    }
//执行一个任务
    @Override
    public void execute(Runnable task) {
        ObjectUtil.checkNotNull(task, "task");
        execute(task, !(task instanceof LazyRunnable) && wakesUpForTask(task));
    }

    @Override
    public void lazyExecute(Runnable task) {
        execute(ObjectUtil.checkNotNull(task, "task"), false);
    }

    private void execute(Runnable task, boolean immediate) {
    //获得当前是否在EventLoop的线程中
        boolean inEventLoop = inEventLoop();
        //添加到任务队列
        addTask(task);
        if (!inEventLoop) {
        //创建线程
            startThread();
            //如果已经关闭,移除任务并且进行拒绝
            if (isShutdown()) {
                boolean reject = false;
                try {
                    if (removeTask(task)) {
                        reject = true;
                    }
                } catch (UnsupportedOperationException e) {
                }
                if (reject) {
                    reject();
                }
            }
        }
		//唤醒线程
        if (!addTaskWakesUp && immediate) {
            wakeup(inEventLoop);
        }
    }
	//执行多个普通任务,有一个执行完成即可
    @Override
    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
        throwIfInEventLoop("invokeAny");
        return super.invokeAny(tasks);
    }

    @Override
    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException {
        throwIfInEventLoop("invokeAny");
        return super.invokeAny(tasks, timeout, unit);
    }
	//执行多个普通任务
    @Override
    public <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
            throws InterruptedException {
        throwIfInEventLoop("invokeAll");
        return super.invokeAll(tasks);
    }

    @Override
    public <T> List<java.util.concurrent.Future<T>> invokeAll(
            Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException {
        throwIfInEventLoop("invokeAll");
        return super.invokeAll(tasks, timeout, unit);
    }
	//判断若在EventLoop的线程中调用该方法
    private void throwIfInEventLoop(String method) {
        if (inEventLoop()) {
            throw new RejectedExecutionException("Calling " + method + " from within the EventLoop is not allowed");
        }
    }
//获得EventLoop的线程属性
    public final ThreadProperties threadProperties() {
        ThreadProperties threadProperties = this.threadProperties;
        if (threadProperties == null) {
            Thread thread = this.thread;
            if (thread == null) {
                assert !inEventLoop();
                //提交空任务,促使execute方法执行
                submit(NOOP_TASK).syncUninterruptibly();
                //获得线程
                thread = this.thread;
                assert thread != null;
            }
			//创建DefaultThreadProperties对象
            threadProperties = new DefaultThreadProperties(thread);
            //CAS修改属性
            if (!PROPERTIES_UPDATER.compareAndSet(this, null, threadProperties)) {
                threadProperties = this.threadProperties;
            }
        }

        return threadProperties;
    }

    @Deprecated
    protected interface NonWakeupRunnable extends LazyRunnable { }
//判断该任务是否需要唤醒线程
    protected boolean wakesUpForTask(Runnable task) {
        return true;
    }

    protected static void reject() {
        throw new RejectedExecutionException("event executor terminated");
    }
	//拒绝任务
    protected final void reject(Runnable task) {
    //拒绝执行器来拒绝任务
        rejectedExecutionHandler.rejected(task, this);
    }

    private static final long SCHEDULE_PURGE_INTERVAL = TimeUnit.SECONDS.toNanos(1);
	//启动EventLoop独占的线程
    private void startThread() {
        if (state == ST_NOT_STARTED) {
            if (STATE_UPDATER.compareAndSet(this, ST_NOT_STARTED, ST_STARTED)) {
            //是否启动成功
                boolean success = false;
                try {
                    doStartThread();
                    //将标志位设置为成功
                    success = true;
                } finally {
                    if (!success) {
                        STATE_UPDATER.compareAndSet(this, ST_STARTED, ST_NOT_STARTED);
                    }
                }
            }
        }
    }

    private boolean ensureThreadStarted(int oldState) {
        if (oldState == ST_NOT_STARTED) {
            try {
                doStartThread();
            } catch (Throwable cause) {
                STATE_UPDATER.set(this, ST_TERMINATED);
                terminationFuture.tryFailure(cause);

                if (!(cause instanceof Exception)) {
                    // Also rethrow as it may be an OOME for example
                    PlatformDependent.throwException(cause);
                }
                return true;
            }
        }
        return false;
    }
//启动独占的线程
    private void doStartThread() {
        assert thread == null;
        executor.execute(new Runnable() {
            @Override
            public void run() {
            //记录当前的线程
                thread = Thread.currentThread();
                //如果当前的线程已经被标记打断,就进行打断
                if (interrupted) {
                    thread.interrupt();
                }
				//是否执行成功
                boolean success = false;
                //更新最后一次执行时间
                updateLastExecutionTime();
                try {
                //执行任务
                    SingleThreadEventExecutor.this.run();
                    //标记执行成功
                    success = true;
                } catch (Throwable t) {
                    logger.warn("Unexpected exception from an event executor: ", t);
                } finally {
                    for (;;) {
                        int oldState = state;
                        if (oldState >= ST_SHUTTING_DOWN || STATE_UPDATER.compareAndSet(
                                SingleThreadEventExecutor.this, oldState, ST_SHUTTING_DOWN)) {
                            break;
                        }
                    }

                    // Check if confirmShutdown() was called at the end of the loop.
                    if (success && gracefulShutdownStartTime == 0) {
                        if (logger.isErrorEnabled()) {
                            logger.error("Buggy " + EventExecutor.class.getSimpleName() + " implementation; " +
                                    SingleThreadEventExecutor.class.getSimpleName() + ".confirmShutdown() must " +
                                    "be called before run() implementation terminates.");
                        }
                    }

                    try {
                        for (;;) {
                            if (confirmShutdown()) {
                                break;
                            }
                        }
                        for (;;) {
                            int oldState = state;
                            if (oldState >= ST_SHUTDOWN || STATE_UPDATER.compareAndSet(
                                    SingleThreadEventExecutor.this, oldState, ST_SHUTDOWN)) {
                                break;
                            }
                        }
                        confirmShutdown();
                    } finally {
                        try {
                        //清理释放资源
                            cleanup();
                        } finally {
                            FastThreadLocal.removeAll();
                            STATE_UPDATER.set(SingleThreadEventExecutor.this, ST_TERMINATED);
                            threadLock.countDown();
                            int numUserTasks = drainTasks();
                            if (numUserTasks > 0 && logger.isWarnEnabled()) {
                                logger.warn("An event executor terminated with " +
                                        "non-empty task queue (" + numUserTasks + ')');
                            }
                            terminationFuture.setSuccess(null);
                        }
                    }
                }
            }
        });
    }

    final int drainTasks() {
        int numTasks = 0;
        for (;;) {
            Runnable runnable = taskQueue.poll();
            if (runnable == null) {
                break;
            }
            // WAKEUP_TASK should be just discarded as these are added internally.
            // The important bit is that we not have any user tasks left.
            if (WAKEUP_TASK != runnable) {
                numTasks++;
            }
        }
        return numTasks;
    }
//线程属性的实现类
    private static final class DefaultThreadProperties implements ThreadProperties {
        private final Thread t;

        DefaultThreadProperties(Thread t) {
            this.t = t;
        }

        @Override
        public State state() {
            return t.getState();
        }

        @Override
        public int priority() {
            return t.getPriority();
        }

        @Override
        public boolean isInterrupted() {
            return t.isInterrupted();
        }

        @Override
        public boolean isDaemon() {
            return t.isDaemon();
        }

        @Override
        public String name() {
            return t.getName();
        }

        @Override
        public long id() {
            return t.getId();
        }

        @Override
        public StackTraceElement[] stackTrace() {
            return t.getStackTrace();
        }

        @Override
        public boolean isAlive() {
            return t.isAlive();
        }
    }
}

Netty源码解析-SizeClasses 引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。 阅读详情

相关推荐

【Netty】netty启动流程源码解析

【Netty】netty启动流程源码解析

芝兰生于深谷,不以无人而不芳 1319

Netty详解之四:EventExecutor框架

Netty是按事件驱动模型来工作的,在涉及Netty的网络通信功能之前,我们先彻底剖析一下它的事件驱动机制,或者说是Netty的并发机制。 netty并发相关类全部位于io.netty.util.concurrent下面,居于核心位置的接口有两个:EventLoopGroup和EventLoop。 由于Netty并发机制相对比较独立,完全可独立于其他功能而被使用,所以这块的分析我们采用自顶向下的方式。Netty的并发机制实际上是java executor框架的一个实现,它比JDK的executor更加强大一

longhuihu的专栏 4834

解决 `version ‘GLIBCXX_3.4.32‘ not found‘ not found` 错误

解决 `version 'GLIBCXX_3.4.32' not found' not found` 错误

engchina的专栏 5677

netty源码之NioEventLoop

EventLoop的类继承结构 EventExecutor继承了 EventExecutorGroup,是一个特殊的EventExecutorGroup。主要增加了inEventLoop的判断方法、promise、future支持OrderedEventExecutor继承自EventExecutor,并没有增加方法,只是一个标记接口,标记该EventExecutor会串行执行提交的任务EventLoop继承了两个接口,EventLoopGroup跟OrderedEventExecutor,重新声明了par

qq_32868023的博客 537

保姆级教程:用MATLAB复现格拉斯哥大学FMCW雷达数据集多普勒谱(附完整代码与避坑指南)

本文提供了一份详细的MATLAB教程,指导如何复现格拉斯哥大学FMCW雷达数据集的多普勒谱分析。从环境准备、数据获取到距离压缩、MTI滤波、时频分析(STFT)以及结果后处理,涵盖了完整流程,并附有优化代码和避坑指南,特别适合雷达信号处理研究者和工程师。

weixin_28720767的博客 116

【实战指南】从零构建UNet多分类分割数据集:标注、转换与训练全流程

本文提供了一份从零构建UNet多分类分割数据集的完整实战指南。详细介绍了使用Labelme进行图像标注的核心技巧与规范,并通过Python脚本将标注结果转换为模型可用的VOC格式。最后,指导如何修改经典的PyTorch版UNet代码,以适配自定义数据集并进行训练与测试,帮助读者完成从数据准备到模型训练的全流程。

arduino9maker的博客 288

netty组件之EventLoop

事件循环对象 EventLoop 本质是一个单线程执行器(同时维护了一个 Selector),里面有 run 方法处理 Channel 上源源不断的 io 事件。 继承关系 一条线是继承自 j.u.c.ScheduledExecutorService 因此包含了线程池中所有的方法 另一条线是继承自 netty 自己的 OrderedEventExecutor, 提供了 boolean inEventLoop(Thread thread) 方法判断一个线程是否属于此 EventLoop 提供了 paren

唐昊 640

Polyworks脚本开发实战指南:高效生成数据彩图与报告的关键指令解析

本文深入解析了Polyworks脚本开发中生成数据彩图与自动化报告的核心指令。通过实战案例,详细介绍了REFERENCE_SURFACE、THICKNESS和CLEARANCE等关键彩图生成指令的正确用法与常见避坑点,并阐述了如何利用REPORT_ITEM命令实现从截图、表格生成到智能排版的全流程自动化,旨在帮助三维检测与质量控制工程师大幅提升工作效率与报告标准化水平。

weixin_29209825的博客 556

【JAVA 网络编程系列】Netty -- 线程池

【JAVA 网络编程系列】Netty -- 线程池 【1】Netty -- Future 【1.1】Future 继承体系 左边,跟 Runnable 相关,表示的是任务,主要实现类有 PromiseTask、ScheduledFutureTask 等; 中间,主要是 Promise 相关,经典实现 DefaultPromise; 右边,跟 Complete 相关,表示完成,Netty 将完成分成两种状态,即 Succeeded 和 Failed; 最后一部分,跟 Channel 相关,可以跟 P

CopperSun 技术博客 1053

7.3 空间矢量调制(SVM)整数算法

本文提出了一种基于整数运算的空间矢量调制(SVM)优化实现方案,适用于计算资源有限的Cortex-M0平台。针对传统SVM算法中复杂的三角函数和浮点运算问题,重点优化了扇区判断和占空比计算两个关键环节。在扇区判断方面,采用基于电压分量符号和相对大小的三变量法,避免了角度计算;在占空比计算方面,通过几何关系将作用时间表示为电压分量的线性组合,并采用定点数实现。方案还详细讨论了系数定点化、死区补偿等实现细节,在保证精度的同时显著降低了计算复杂度。实验结果表明,优化后的整数算法在M0平台上仅需50-80个周期即可

技术工作者 944

从技术债红线到系统治理:透视 SAP Clean Core 中的 Level D

SAP推出的Clean Core分级体系将扩展风险划分为A到D四个等级,其中Level D代表最高风险类别,涉及直接修改标准代码、隐式增强、使用noAPI对象等不被推荐的做法。这些做法虽然短期见效快,但会带来升级冲突、数据完整性风险等长期问题。SAP强调治理重点不是完全消除经典ABAP,而是优先清理Level D对象,逐步向稳定接口迁移。典型案例显示,依赖内部细节的扩展往往在系统升级或云迁移时集中暴露出问题。企业应通过工具链持续监控Level D占比,将其纳入技术债管理范畴。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1064

[netty源码分析]--ChannelPipeline源码分析(一)

在前面我们已经分析过了netty的线程模型,了解了当线程池启动之后就会处于一种事件循环的状态,不断调用select() 函数,查询已注册的channel中的就绪事件。 下面我们就来研究一下当IO事件被获取之后是怎么在ChannelPipeline中的handler传递运行的。1. Channel和ChannelPipeline的关系在netty中,每个Channel 有且仅有一个ChannelPip

惜暮 1892

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3657

Netty 4.2.x 源码深度解析 (一):架构整体全貌 —— 模块划分与核心组件关系

本文基于 Netty 4.2.16.Final 解析整体架构,梳理 common、buffer、transport 等六大核心模块职责与层级依赖。阐述 Bootstrap、EventLoop 等五大组件协作机制,厘清主从 Reactor 模型 Boss 与 Worker 线程组分工。重点剖析 4.2.x 核心的 IoHandler/IoHandle 分层架构,对比旧版局限,说明其实现传输层可插拔的优势,总结异步非阻塞、内存池化等设计理念,搭建 Netty 源码学习全局认知。

于云原生深处,追寻架构与代码的优雅 582

【Pix4d精品教程】Pix4d中央子午线细化设置(测区跨两个分带)

本文介绍了在Pix4d软件中通过修改中央子午线设置来解决跨分带测区刺点问题的方法。针对测区跨3度分带(如105°和108°之间)时像控点与靶标点偏移较大的情况,建议将中央子午线设为测区中心(如106.5°)。具体操作步骤包括:修改投影文件中的中央子午线参数,选择新的输出坐标系配置文件。该方法能有效提高像控点刺点效率,为航测内业数据处理提供便利。操作简单实用,适合大比例尺测图项目中跨分带测区的数据处理需求。

智慧空间实验室 5527

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

DolphinScheduler 3.2.0 Worker启动核心源码解析

摘要:DolphinScheduler Worker启动流程包括多个关键步骤:1)启动Netty RPC服务端和客户端,实现任务接收与结果反馈;2)通过SPI加载任务插件,支持多种任务类型;3)注册到Zookeeper注册中心,使Master可发现;4)启动管理线程处理任务队列和执行;5)开启消息重试线程确保可靠性。Worker采用Netty异步通信、线程池任务执行、注册中心心跳检测等机制,实现了高并发、可靠性和可扩展性,完整支持"接收-执行-反馈"的任务处理闭环。(148字)

道可道非常道 1288

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Netty 核心源码解析

Netty 第一讲:Netty 架构与原理本文是《Netty 三讲》的第二讲:Netty 核心源码解析(部分),大纲如下:前言1. Netty 服务端启动过程源码剖析1.1. 执行 ne...

weixin_41385912的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Netty源码解析-Netty源码包及IO模式源码分析

Netty通过channel的反射工厂获取channel的构造器,channel类型通过参数传递(这里实现对不同类型IO的支持),channel通过反射工厂在需要的时候构造出来(这里是一个优化)。我们可以看到Netty的代码确实做了很多优化。

qq_36037795的博客 2239

Netty框架源码解析

Netty的线程模型

弦月的博客 1万+

Netty——源码解析

JAVA后端开发知识总结(持续更新…) Netty—— 文章目录Netty——零、前言一、Netty服务器启动源码 零、前言 在 io.netty.example 包下,有很多 Netty 源码案例,可以用来分析。 一、Netty服务器启动源码 源码需要剖析到 Netty 中调用 doBind 方法,追踪到 NioServerSocketChannel 的 doBind。 同时要 Debug 程序到 NioEventLoop 类的 run 方法,无限循环,在服务器端运行。 ...

weixin_43415481的博客 1800

Netty启动源码解析

Netty启动源码解析

qq_40913932的博客 1100

Netty源码深度解析

最后做一个小的总结,下图是我在网上,充分说明了Netty框架的运行模式,它是基于Reactor模型的主从架构:需要创建两个线程组EventLoopGroup,即bossGroup和workerGroup,一般bossGroup设置的线程组中线程的数量为1(也可以设置>1,如果这样设置的话,就需要绑定其他的端口,设置几个,绑定几个端口),workerGroup设置的线程组是多个,不设置默认创建的线程数量为 CPU核心数×2。今天,聊一聊Netty源码。因此,Netty使用。

weixin_41338970的博客 2281

Netty源码解析

Netty源码解析Netty源码解析示例NioEventLoopGroup的创建ServerBootstrap 创建和配置端口绑定,启动服务端NioServerSocketChannel的创建和初始化NioServerSocketChannel的创建NioServerSocketChannel的初始化端口绑定接收客户端连接请求,注册Channel到workGroup中Netty 接受请求过程ChannelPipeline,ChannelHandler,ChannelHandlerContext的创建Cha

weixin_43889578的博客 677

Netty 源码解析(上)

netty源码解析

黄裳博客 3413

Spring与Netty底层源码解析

本文介绍了Spring与Netty的整合以及对Netty底层源码的深入解析,在实际项目中,充分利用Spring提供的整合支持,结合对Netty底层源码的理解,可以更好地开发高性能、灵活的网络 应用,我们希望通过本文的介绍能够为大家在网络应用开发中提供一些参考,另外也希望通过阅读Netty的源码,能够对大家的技术水平有所帮助。

dzend的专栏 891

Netty系列之源码解析(一)

今天是猿灯塔“365篇原创计划”第十三篇。 接下来的时间灯塔君持续更新Netty系列一共九篇 当前:Netty 源码解析(一)开始 Netty 源码解析(二): Netty 的 Channel Netty 源码解析(三): Netty 的 Future 和 Promise Netty 源码解析(四): Netty 的 ChannelPipeline Netty 源码解析(五): Netty 的线程...

猿灯塔的博客 660
上一篇: Netty组件源码解析(1)
下一篇: Netty组件源码解析(3)
jacobbbbbbbb
博客等级 码龄7年 6粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值