EventExecutorGroup
接口定义
先看EventExecutorGroup接口的定义,注意这个类在packag "io.netty.util.concurrent"下:
package io.netty.util.concurrent
public interface EventExecutorGroup extends ScheduledExecutorService, AutoCloseable {}
EventExecutorGroup继承自jdk java.util.concurrent包下的ScheduledExecutorService, 这意味着EventExecutorGroup本身就是一个标准的jdk executor, 提供定时任务的支持.
增强shutdown()方法
EventExecutorGroup中针对ExecutorService的shutdown()提供了增强,提供了优雅关闭的方法shutdownGracefully().
从代码上看,具体做法是EventExecutorGroup覆盖了executor的标准方法shutdown()和shutdownNow(), 加上了@Deprecated标记. 在javadoc中要求使用者不要调用这两个方法, 改为调用EventExecutorGroup接口中定义的shutdownGracefully()方法. 另外增加了一个isShuttingDown()方法来检查是否正在关闭:
/**
* 当且仅当这个EventExecutorGroup管理的所有EventExecutor正在被shutdownGracefully()方法优雅关闭或被已经被关闭.
*/
boolean isShuttingDown();
/**
* 等同于以合理的默认参数调用shutdownGracefully(quietPeriod, timeout, unit)方法
*/
Future<?> shutdownGracefully();
/**
* 发信号给这个executor,告之调用者希望这个executor关闭. 一旦这个方法被调用, isShuttingDown()方法就将开始返回true, 然后这个executor准备关闭自己. 和shutdown()不同, 优雅关闭保证在关闭之前,在静默时间(the quiet period, 通常是几秒钟)内没有任务提交. 如果在静默时间内有任务提交, 这个任务将被接受, 而静默时间将重头开始.
*
* @param quietPeriod 上面文档中描述的静默时间
* @param timeout 等待的最大超时时间, 直到executor被关闭, 无论在静默时间内是否有任务被提交
* @param unit 静默时间和超时时间的单位
*
* @return the {@link #terminationFuture()}
*/
Future<?> shutdownGracefully(long quietPeriod, long timeout, TimeUnit unit);
Future<?> terminationFuture();
@Deprecated //禁用,用shutdownGracefully()代替
void shutdown();
@Deprecated //禁用,用shutdownGracefully()代替
List<Runnable> shutdownNow();
这里还有增加了一个terminationFuture()方法, 获取一个Future, 当这个EventExecutorGroup管理的所有的EventExecutors都被终止时可以得到通知.
管理EventExecutor
然后是最重要的两个方法next()和children():
/**
* 返回这个EventExecutorGroup管理的一个EventExecutor
*/
EventExecutor next();
/**
* 返回这个EventExecutorGroup管理的所有EventExecutor的不可变集合
*/
<E extends EventExecutor> Set<E> children();
这里可以看到EventExecutorGroup和EventExecutor的关系是:
- EventExecutorGroup管理了(从对象关系上说是"聚合"了)多个EventExecutor
- next()方法返回其中的一个EventExecutor
- children()返回所有的EventExecutor
覆盖submit()和schedule()方法
EventExecutorGroup中的submit()方法, 对照了一下, 和ExecutorService接口中完全相同的.
@Override
Future<?> submit(Runnable task);
@Override
<T> Future<T> submit(Runnable task, T result);
@Override
<T> Future<T> submit(Callable<T> task);
但是仔细看,会有个非常不起眼的小地方,submit()方法方法的返回对象不同,虽然都是Future:
- EventExecutorGroup中submit()方法返回的 Future 是 "io.netty.util.concurrent.Future"
- ExecutorService中submit()方法返回的 Future 是 "java.util.concurrent.Future"
下面是io.netty.util.concurrent.Future的代码, 继承自java.util.concurrent.Future,然后增加了一些特有方法:
public interface Future<V> extends java.util.concurrent.Future<V> {
......
}
类似的, schedule()方法也是同样覆盖了接口ScheduledExecutorService中的对应方法, 依然是修改了返回的 对象类型, 用io.netty.util.concurrent.ScheduledFuture替代了java.util.concurrent.ScheduledFuture:
public interface ScheduledFuture<V> extends Future<V>, java.util.concurrent.ScheduledFuture<V> {
......
}
EventExecutor
接口定义
EventExecutor的设计比较费解, 居然是从EventExecutorGroup下继承:
public interface EventExecutor extends EventExecutorGroup {
}
考虑到EventExecutorGroup的设计中, EventExecutorGroup内部是聚合/管理了多个EventExecutor. 然后现在EventExecutor再继承EventExecutorGroup一把, 我有些凌乱了......
和EventExecutorGroup的关系
在EventExecutor中覆盖了EventExecutorGroup的next()/children(), 在我看来这是netty在努力的收拾凌乱的局面:
@Override
EventExecutor next();
@Override
<E extends EventExecutor> Set<E> children();
EventExecutorGroup parent();
- next()方法: EventExecutorGroup中next()方法用来返回管理的EventExecutor中的其中一个, 到了EventExecutor中, 这里应该不会继续再管理其他EventExecutor了, 所以next()方法被覆盖为仅仅返回当前EventExecutor本身的引用
- children()方法: EventExecutorGroup中children()方法用来返回管理的所有的EventExecutor, 到了EventExecutor中,返回的集合就只能包含自身一个引用.
- parent()方法: 新增加的方法,返回当前EventExecutor所属的EventExecutorGroup
inEventLoop()方法
inEventLoop()方法用于查询某个线程是否在EventExecutor所管理的线程中.
/**
* 等同于调用inEventLoop(Thread.currentThread())
*/
boolean inEventLoop();
/**
* 当给定的线程在event loop中返回true, 否则返回false
*/
boolean inEventLoop(Thread thread);
unwrap()方法
unwrap()方法用于返回一个非WrappedEventExecutor的EventExecutor.
- 对于WrappedEventExecutor的实现类,需要返回底层包裹的EventExecutor, 而且要保证返回的EventExecutor也不是WrappedEventExecutor (这意味着可能需要调用多次unwrap())
- 对于非WrappedEventExecutor的实现类, 只要简单返回自身实例就好了
- 强调, 一定不能返回null
EventExecutor unwrap();
创建Promise和Future
<V> Promise<V> newPromise();
<V> ProgressivePromise<V> newProgressivePromise();
<V> Future<V> newSucceededFuture(V result);
<V> Future<V> newFailedFuture(Throwable cause);
这个细节后面研究Promise和Future时再先看, 先跳过.