- 浏览: 950286 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
netty 事件执行器组和事件执行器定义及抽象实现:http://donald-draper.iteye.com/blog/2391257
netty 多线程事件执行器组:http://donald-draper.iteye.com/blog/2391270
netty 多线程事件循环组:http://donald-draper.iteye.com/blog/2391276
netty 抽象调度事件执行器:http://donald-draper.iteye.com/blog/2391379
netty 单线程事件执行器初始化:http://donald-draper.iteye.com/blog/2391895
netty 单线程事件执行器执行任务与graceful方式关闭:http://donald-draper.iteye.com/blog/2392051
netty 单线程事件循环:http://donald-draper.iteye.com/blog/2392067
netty nio事件循环初始化:http://donald-draper.iteye.com/blog/2392161
netty nio事件循环后续:http://donald-draper.iteye.com/blog/2392264
引言:
前面的文章我们看了Nio事件循环,先来回顾一下:
Nio事件循环内部有一个取消选择key计数器清理间隔CLEANUP_INTERVAL,用于当取消的选择key达到256个时,重置取消选择key计数器cancelledKeys(int),并重新进行选择操作;选择器自动重构阈值SELECTOR_AUTO_REBUILD_THRESHOLD,默认选择操作发生512次,用于控制当选择器发生多少次选择操作时,重构选择器;选择器状态判断器selectNowSupplier,用于获取Nio事件循环内部选择器的选择操作结果;同时有一个选择器selector,未包装过的选择器unwrappedSelector和一个选择器提供者provider,一个选择key就绪集合selectedKeys(SelectedSelectionKeySet);当选择器的选择操作阻塞时,wakenUp(AtomicBoolean)属性决定是否应该break选择操作过程;一个Nio处理Io事件的时间占比ioRatio(int),默认为50,即IO事件处理时间和其他事件处理时间各占Nio事件循环一半;一个选择策略selectStrategy用于控制选择循环,如果返回结果为-1,则下一步应该阻塞选择操作,如果返回结果为-2,则下一步应该调回IO事件循环,处理IO事件,而不是继续执行选择操作,返回值大于0,表示需要有工作要做,即注册到选择器的选择通道有IO事件就绪。
Nio事件循环初始化,主要是将Nio事件循环组和事件执行器及任务拒绝策略传给父类单线程事件循环(单线程事件执行器),同时打开一个选择器。
打开选择器过程,委托给选择器提供者打开一个选择器,如果需要优化选择器的,在当前线程访问控制选择下,加载选择器实现类,不初始化,如果从系统类加载器加载的选择key实现类不是Class实例,或不是裸选择器类型,不进行选择器key集合优化,及选择器为选择器提供者打开的裸选择器;否则在当前线程相同访问控制权限下,获取系统选择器实现类的,选择器就绪key集合selectedKeysField及其代理publicSelectedKeysField,设置选择器就绪key集合selectedKeysField及其代理publicSelectedKeysField访问控制权限,将系统选择器的就绪key集合selectedKeysField及其代理publicSelectedKeysField设值为selectedKeySet(SelectedSelectionKeySet),并将选择器selector包装为SelectedSelectionKeySetSelector。
Nio事件循环启动后,首先选择策略根据选择器结果提供者和任务队列是否有任务生成下一步的操作策略,如果选择操作结果返回为SelectStrategy.CONTINUE,则跳出当前事件循环,如果为SelectStrategy.SELECT,则执行选择操作,并阻塞下一次选择操作,如果需要唤醒选择器,则唤醒;然后重置取消选择key计数器cancelledKeys为0,置是否需要重新选择属性needsToSelectAgain为false,然后处理选择器就绪的选择key,在根据当前IO事件处理时间百分比ioRatio,决定是执行任务队列所有任务还是超时执行任务队列任务,如果ioRatio小于100,则为超时执行任务队列中任务;最后检查事件循环是否正在关闭,是则反注册选择器中的选择通道,并关闭,确定事件循环关闭;上述整个过程在事件循环运行期间,不断地重复。在事件循环的每次处理过程中,在最后都要检查意见事件循环是否关闭,如果正在关闭,则关闭注册到选择器的所有通道,并确保事件循环关闭。
选择操作的过程为,首先重置选择操作计数器为0,计算选择操作延时时间;如果延时时间已过去0.5毫秒,且选择操作计数器当前为0,即第一次执行选择操作,执行立刻执行选择操作,更新选择操作计数器,并跳出当前选择操作过程;如果任务队列中有任务,且wakeUp属性为false,并更新为true成功,则立刻执行选择操作,更新选择操作计数器,跳出当前选择操作过程;如果上面两种情况都不是,则执行超时选择操作,如果有选择key就绪,或原始wakeUp属性为true,或当前wakeUp属性为true,或任务队列有任务,或调度任务队列有调度任务,则跳出当前选择操作;如果选择器重构阈值大于0,且当前选择操作计数器的值大于阈值,则重新构造选择器,即创建新的选择器将原始选择器关联的选择key,注册到新的选择器中。
默认的处理选择器就绪选择key集合过程,为遍历选择key集合,处理就绪的选择key,首先选择key当前必须有效,再判断选择key通道事件循环是否是当前循环,否则直接返回,是则判断就绪key的就绪事件是连接请求事件,写事件还是读事件,如果事件连接操作,则委托通道的Unsafe完成通道连接,并移除连接事件;如果是如果是写事件,则委托通道的Unsafe刷新写请求队列,释放内存;果是读事件,则委托给通道的Unsafe的read方法;如果在处理就绪选择key的过程,需要重新执行选择操作,则立刻执行,并更新当前就绪选择key集合及其迭代器。
Nio事件循环内部有一个选择器,所有注册到选择器的通道都在一个事件循环中,Nio事件循环是单线程事件循环,即单线程事件执行器,在处理选择器的就绪选择key时,当且仅当,就绪选择key关联通道所在的事件循环为当前事件循环时,才出来就绪选择key关联通道的就绪IO事件,从而保证通道的读写等操作线程安全。
Nio事件循环实际的工作就是执行选择操作,并处理选择器的就绪选择key,Nio事件循环与Mina的IoProcessor有点相似,都可以看着一个线程执行器,执行通道的IO事件操作,而不同的是Nio管理的是选择器Selector,而Mina的IoProcessor管理的会话IoSession。
今天我们来看一下Nio事件循环组NioEventLoopGroup:
从上面可以看出,nio事件循环组实际为一个多线程事件循环组,主要用于管理nio事件循环;从设置nio事件循环组的IO事件处理时间百分比
和重构nio事件循环组选择器方法,可以看出事件循环组继承迭代器的原因;nio事件循环组可以统一设置组内的nio事件循环的IO事件处理时间百分比,
而nio事件可以动态变更自己的IO事件处理时间百分比,重构选择器也有这么点意思。
nio事件循环组是多线程的,而nio事件循环时单线程的,这个与Mina的IoProcessor和processor的关系有点像。
我们来看构造:
//MultithreadEventLoopGroup
参数args为选择器提供者,选择策略工厂,和拒绝执行策略,传递给父类,我们往下看,看这些参数给予了谁?
//MultithreadEventExecutorGroup
回到nio事件循环组:
有一个newChild方法,返回的是nio事件循环,即单线程事件循环(单线程事件执行器)
//创建Nio事件循环
到这里,我们看到了上是的args参数,事件传给了Nio事件循环。
下面来看一下选择策略工厂:
//DefaultSelectStrategyFactory
//DefaultSelectStrategy
从上面可以看出,默认选择策略DefaultSelectStrategy,策略方法主要根据任务队列是否有任务,来确定第一步的工作,
如果没有任务,则下一步执行选择操作,否则返回选择器选择操作后的结果值,不执行选操作,然后处理操作就绪选择key和
任务队列中的任务。
总结:
nio事件循环组实际为一个多线程事件循环组,主要用于管理nio事件循环;从设置nio事件循环组的IO事件处理时间百分比和重构nio事件循环组选择器方法,可以看出事件循环组继承迭代器的原因;nio事件循环组可以统一设置组内的nio事件循环的IO事件处理时间百分比,而nio事件可以动态变更自己的IO事件处理时间百分比,重构选择器也有这么点意思。nio事件循环组是多线程的,而nio事件循环时单线程的,这个与Mina的IoProcessor和processor的关系有点像。不同的是nio事件循环面向的是选择器Selector,而processor面向的是会话IoSession。
netty 多线程事件执行器组:http://donald-draper.iteye.com/blog/2391270
netty 多线程事件循环组:http://donald-draper.iteye.com/blog/2391276
netty 抽象调度事件执行器:http://donald-draper.iteye.com/blog/2391379
netty 单线程事件执行器初始化:http://donald-draper.iteye.com/blog/2391895
netty 单线程事件执行器执行任务与graceful方式关闭:http://donald-draper.iteye.com/blog/2392051
netty 单线程事件循环:http://donald-draper.iteye.com/blog/2392067
netty nio事件循环初始化:http://donald-draper.iteye.com/blog/2392161
netty nio事件循环后续:http://donald-draper.iteye.com/blog/2392264
引言:
前面的文章我们看了Nio事件循环,先来回顾一下:
Nio事件循环内部有一个取消选择key计数器清理间隔CLEANUP_INTERVAL,用于当取消的选择key达到256个时,重置取消选择key计数器cancelledKeys(int),并重新进行选择操作;选择器自动重构阈值SELECTOR_AUTO_REBUILD_THRESHOLD,默认选择操作发生512次,用于控制当选择器发生多少次选择操作时,重构选择器;选择器状态判断器selectNowSupplier,用于获取Nio事件循环内部选择器的选择操作结果;同时有一个选择器selector,未包装过的选择器unwrappedSelector和一个选择器提供者provider,一个选择key就绪集合selectedKeys(SelectedSelectionKeySet);当选择器的选择操作阻塞时,wakenUp(AtomicBoolean)属性决定是否应该break选择操作过程;一个Nio处理Io事件的时间占比ioRatio(int),默认为50,即IO事件处理时间和其他事件处理时间各占Nio事件循环一半;一个选择策略selectStrategy用于控制选择循环,如果返回结果为-1,则下一步应该阻塞选择操作,如果返回结果为-2,则下一步应该调回IO事件循环,处理IO事件,而不是继续执行选择操作,返回值大于0,表示需要有工作要做,即注册到选择器的选择通道有IO事件就绪。
Nio事件循环初始化,主要是将Nio事件循环组和事件执行器及任务拒绝策略传给父类单线程事件循环(单线程事件执行器),同时打开一个选择器。
打开选择器过程,委托给选择器提供者打开一个选择器,如果需要优化选择器的,在当前线程访问控制选择下,加载选择器实现类,不初始化,如果从系统类加载器加载的选择key实现类不是Class实例,或不是裸选择器类型,不进行选择器key集合优化,及选择器为选择器提供者打开的裸选择器;否则在当前线程相同访问控制权限下,获取系统选择器实现类的,选择器就绪key集合selectedKeysField及其代理publicSelectedKeysField,设置选择器就绪key集合selectedKeysField及其代理publicSelectedKeysField访问控制权限,将系统选择器的就绪key集合selectedKeysField及其代理publicSelectedKeysField设值为selectedKeySet(SelectedSelectionKeySet),并将选择器selector包装为SelectedSelectionKeySetSelector。
Nio事件循环启动后,首先选择策略根据选择器结果提供者和任务队列是否有任务生成下一步的操作策略,如果选择操作结果返回为SelectStrategy.CONTINUE,则跳出当前事件循环,如果为SelectStrategy.SELECT,则执行选择操作,并阻塞下一次选择操作,如果需要唤醒选择器,则唤醒;然后重置取消选择key计数器cancelledKeys为0,置是否需要重新选择属性needsToSelectAgain为false,然后处理选择器就绪的选择key,在根据当前IO事件处理时间百分比ioRatio,决定是执行任务队列所有任务还是超时执行任务队列任务,如果ioRatio小于100,则为超时执行任务队列中任务;最后检查事件循环是否正在关闭,是则反注册选择器中的选择通道,并关闭,确定事件循环关闭;上述整个过程在事件循环运行期间,不断地重复。在事件循环的每次处理过程中,在最后都要检查意见事件循环是否关闭,如果正在关闭,则关闭注册到选择器的所有通道,并确保事件循环关闭。
选择操作的过程为,首先重置选择操作计数器为0,计算选择操作延时时间;如果延时时间已过去0.5毫秒,且选择操作计数器当前为0,即第一次执行选择操作,执行立刻执行选择操作,更新选择操作计数器,并跳出当前选择操作过程;如果任务队列中有任务,且wakeUp属性为false,并更新为true成功,则立刻执行选择操作,更新选择操作计数器,跳出当前选择操作过程;如果上面两种情况都不是,则执行超时选择操作,如果有选择key就绪,或原始wakeUp属性为true,或当前wakeUp属性为true,或任务队列有任务,或调度任务队列有调度任务,则跳出当前选择操作;如果选择器重构阈值大于0,且当前选择操作计数器的值大于阈值,则重新构造选择器,即创建新的选择器将原始选择器关联的选择key,注册到新的选择器中。
默认的处理选择器就绪选择key集合过程,为遍历选择key集合,处理就绪的选择key,首先选择key当前必须有效,再判断选择key通道事件循环是否是当前循环,否则直接返回,是则判断就绪key的就绪事件是连接请求事件,写事件还是读事件,如果事件连接操作,则委托通道的Unsafe完成通道连接,并移除连接事件;如果是如果是写事件,则委托通道的Unsafe刷新写请求队列,释放内存;果是读事件,则委托给通道的Unsafe的read方法;如果在处理就绪选择key的过程,需要重新执行选择操作,则立刻执行,并更新当前就绪选择key集合及其迭代器。
Nio事件循环内部有一个选择器,所有注册到选择器的通道都在一个事件循环中,Nio事件循环是单线程事件循环,即单线程事件执行器,在处理选择器的就绪选择key时,当且仅当,就绪选择key关联通道所在的事件循环为当前事件循环时,才出来就绪选择key关联通道的就绪IO事件,从而保证通道的读写等操作线程安全。
Nio事件循环实际的工作就是执行选择操作,并处理选择器的就绪选择key,Nio事件循环与Mina的IoProcessor有点相似,都可以看着一个线程执行器,执行通道的IO事件操作,而不同的是Nio管理的是选择器Selector,而Mina的IoProcessor管理的会话IoSession。
今天我们来看一下Nio事件循环组NioEventLoopGroup:
package io.netty.channel.nio; import io.netty.channel.Channel; import io.netty.channel.EventLoop; import io.netty.channel.DefaultSelectStrategyFactory; import io.netty.channel.MultithreadEventLoopGroup; import io.netty.channel.SelectStrategyFactory; import io.netty.util.concurrent.EventExecutor; import io.netty.util.concurrent.EventExecutorChooserFactory; import io.netty.util.concurrent.RejectedExecutionHandler; import io.netty.util.concurrent.RejectedExecutionHandlers; import java.nio.channels.Selector; import java.nio.channels.spi.SelectorProvider; import java.util.concurrent.Executor; import java.util.concurrent.ThreadFactory; /** * {@link MultithreadEventLoopGroup} implementations which is used for NIO {@link Selector} based {@link Channel}s. nio事件循环组实际为一个多线程事件循环组,用于管理基于通道的选择器 */ public class NioEventLoopGroup extends MultithreadEventLoopGroup { /** * Create a new instance using the default number of threads, the default {@link ThreadFactory} and * the {@link SelectorProvider} which is returned by {@link SelectorProvider#provider()}. 创建一个默认线程数,默认线程工厂的选择器提供者nio事件循环组,如果没有配置io.netty.eventLoopThreads系统属性的话, 默认线程数为处理器的2倍,see#MultithreadEventLoopGroup */ public NioEventLoopGroup() { this(0); } /** * Create a new instance using the specified number of threads, {@link ThreadFactory} and the * {@link SelectorProvider} which is returned by {@link SelectorProvider#provider()}. 创建指定线程数量的事件循环组 */ public NioEventLoopGroup(int nThreads) { this(nThreads, (Executor) null); } //这些构造都和简单,不一一讲了see##MultithreadEventLoopGroup讲解 /** * Create a new instance using the specified number of threads, the given {@link ThreadFactory} and the * {@link SelectorProvider} which is returned by {@link SelectorProvider#provider()}. */ public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory) { this(nThreads, threadFactory, SelectorProvider.provider()); } public NioEventLoopGroup(int nThreads, Executor executor) { this(nThreads, executor, SelectorProvider.provider()); } /** * Create a new instance using the specified number of threads, the given {@link ThreadFactory} and the given * {@link SelectorProvider}. */ public NioEventLoopGroup( int nThreads, ThreadFactory threadFactory, final SelectorProvider selectorProvider) { this(nThreads, threadFactory, selectorProvider, DefaultSelectStrategyFactory.INSTANCE); } public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory, final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory) { super(nThreads, threadFactory, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject()); } public NioEventLoopGroup( int nThreads, Executor executor, final SelectorProvider selectorProvider) { this(nThreads, executor, selectorProvider, DefaultSelectStrategyFactory.INSTANCE); } public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory) { super(nThreads, executor, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject()); } public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory) { super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject()); } public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory, final RejectedExecutionHandler rejectedExecutionHandler) { super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, rejectedExecutionHandler); } /** * Sets the percentage of the desired amount of time spent for I/O in the child event loops. The default value is * {@code 50}, which means the event loop will try to spend the same amount of time for I/O as for non-I/O tasks. 设置nio事件循环组的IO事件处理时间百分比 */ public void setIoRatio(int ioRatio) { //遍历事件循环组,设置nio事件循环的IO事件处理时间百分比 for (EventExecutor e: this) { ((NioEventLoop) e).setIoRatio(ioRatio); } } /** * Replaces the current {@link Selector}s of the child event loops with newly created {@link Selector}s to work * around the infamous epoll 100% CPU bug. 重构nio事件循环组选择器 */ public void rebuildSelectors() { //遍历事件循环组,重构nio事件循环的选择器 for (EventExecutor e: this) { ((NioEventLoop) e).rebuildSelector(); } } //创建Nio事件循环 @Override protected EventLoop newChild(Executor executor, Object... args) throws Exception { return new NioEventLoop(this, executor, (SelectorProvider) args[0], ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]); } }
从上面可以看出,nio事件循环组实际为一个多线程事件循环组,主要用于管理nio事件循环;从设置nio事件循环组的IO事件处理时间百分比
和重构nio事件循环组选择器方法,可以看出事件循环组继承迭代器的原因;nio事件循环组可以统一设置组内的nio事件循环的IO事件处理时间百分比,
而nio事件可以动态变更自己的IO事件处理时间百分比,重构选择器也有这么点意思。
nio事件循环组是多线程的,而nio事件循环时单线程的,这个与Mina的IoProcessor和processor的关系有点像。
public interface EventLoopGroup extends EventExecutorGroup {
public interface EventExecutorGroup extends ScheduledExecutorService, Iterable<EventExecutor> {
我们来看构造:
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory, final RejectedExecutionHandler rejectedExecutionHandler) { super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, rejectedExecutionHandler); }
//MultithreadEventLoopGroup
/** * @see MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor, * EventExecutorChooserFactory, Object...) */ protected MultithreadEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, Object... args) { super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, chooserFactory, args); }
参数args为选择器提供者,选择策略工厂,和拒绝执行策略,传递给父类,我们往下看,看这些参数给予了谁?
//MultithreadEventExecutorGroup
protected MultithreadEventExecutorGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, Object... args) { ... children = new EventExecutor[nThreads]; for (int i = 0; i < nThreads; i ++) { boolean success = false; try { //关键在这,创建事件执行器 children[i] = newChild(executor, args); success = true; } ... } /** * Create a new EventExecutor which will later then accessible via the {@link #next()} method. This method will be * called for each thread that will serve this {@link MultithreadEventExecutorGroup}. *待子类扩展 */ protected abstract EventExecutor newChild(Executor executor, Object... args) throws Exception;
回到nio事件循环组:
有一个newChild方法,返回的是nio事件循环,即单线程事件循环(单线程事件执行器)
//创建Nio事件循环
@Override protected EventLoop newChild(Executor executor, Object... args) throws Exception { return new NioEventLoop(this, executor, (SelectorProvider) args[0], ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]); }
到这里,我们看到了上是的args参数,事件传给了Nio事件循环。
下面来看一下选择策略工厂:
public NioEventLoopGroup( int nThreads, Executor executor, final SelectorProvider selectorProvider) { this(nThreads, executor, selectorProvider, DefaultSelectStrategyFactory.INSTANCE); }
//DefaultSelectStrategyFactory
public final class DefaultSelectStrategyFactory implements SelectStrategyFactory { public static final SelectStrategyFactory INSTANCE = new DefaultSelectStrategyFactory(); private DefaultSelectStrategyFactory() { } @Override public SelectStrategy newSelectStrategy() { return DefaultSelectStrategy.INSTANCE; } }
//DefaultSelectStrategy
package io.netty.channel; import io.netty.util.IntSupplier; /** * Default select strategy. */ final class DefaultSelectStrategy implements SelectStrategy { static final SelectStrategy INSTANCE = new DefaultSelectStrategy(); private DefaultSelectStrategy() { } //获取选择器当前状态 @Override public int calculateStrategy(IntSupplier selectSupplier, boolean hasTasks) throws Exception { //如果有任务则返回,选择器选择后的结果值,否则返回为SelectStrategy.SELECT return hasTasks ? selectSupplier.get() : SelectStrategy.SELECT; } }
从上面可以看出,默认选择策略DefaultSelectStrategy,策略方法主要根据任务队列是否有任务,来确定第一步的工作,
如果没有任务,则下一步执行选择操作,否则返回选择器选择操作后的结果值,不执行选操作,然后处理操作就绪选择key和
任务队列中的任务。
总结:
nio事件循环组实际为一个多线程事件循环组,主要用于管理nio事件循环;从设置nio事件循环组的IO事件处理时间百分比和重构nio事件循环组选择器方法,可以看出事件循环组继承迭代器的原因;nio事件循环组可以统一设置组内的nio事件循环的IO事件处理时间百分比,而nio事件可以动态变更自己的IO事件处理时间百分比,重构选择器也有这么点意思。nio事件循环组是多线程的,而nio事件循环时单线程的,这个与Mina的IoProcessor和processor的关系有点像。不同的是nio事件循环面向的是选择器Selector,而processor面向的是会话IoSession。
发表评论
-
netty NioSocketChannel解析
2017-09-29 12:50 1230netty 抽象BootStrap定义:http://dona ... -
netty Pooled字节buf分配器
2017-09-28 13:00 1964netty 字节buf定义:http://donald-dra ... -
netty Unpooled字节buf分配器
2017-09-26 22:01 2358netty 字节buf定义:http://donald-dra ... -
netty 抽象字节buf分配器
2017-09-26 08:43 1255netty 字节buf定义:http:// ... -
netty 复合buf概念
2017-09-25 22:31 1252netty 字节buf定义:http://donald-dra ... -
netty 抽象字节buf引用计数器
2017-09-22 12:48 1518netty 字节buf定义:http://donald-dra ... -
netty 抽象字节buf解析
2017-09-22 09:00 1758netty 通道接口定义:http://donald-drap ... -
netty 资源泄漏探测器
2017-09-21 09:37 1322netty 通道接口定义:http://donald-drap ... -
netty 字节buf定义
2017-09-20 08:31 2748netty 通道接口定义:http://donald-drap ... -
netty 默认通道配置后续
2017-09-18 08:36 2094netty 通道接口定义:http://donald-drap ... -
netty 默认通道配置初始化
2017-09-17 22:51 1937netty 通道接口定义:http://donald-drap ... -
netty 通道配置接口定义
2017-09-17 14:51 1011netty 通道接口定义:http://donald-drap ... -
netty NioServerSocketChannel解析
2017-09-16 13:01 1806netty ServerBootStrap解析:http:// ... -
netty 抽象nio消息通道
2017-09-15 15:30 1158netty 通道接口定义:http:/ ... -
netty 抽象nio字节通道
2017-09-14 22:39 1140netty 通道接口定义:http:/ ... -
netty 抽象nio通道解析
2017-09-14 17:23 889netty 通道接口定义:http://donald-drap ... -
netty 抽象通道后续
2017-09-13 22:40 1234netty Inboudn/Outbound通道Inv ... -
netty 通道Outbound缓冲区
2017-09-13 14:31 2123netty 通道接口定义:http:/ ... -
netty 抽象Unsafe定义
2017-09-12 21:24 992netty 通道接口定义:http:/ ... -
netty 抽象通道初始化
2017-09-11 12:56 1788netty 管道线定义-ChannelPipeline:htt ...
相关推荐
netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty开发之nio netty...
netty nio 封装java nio用于网络分布式数据传输。
基于netty的nio使用demo源码
包含了Netty,NIO AIO,Mina知识的详解以及netty结合spring protocolbuf的源码
Java高并发编程代码(Netty NIO 实例)
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...
资源名称:Java_NIO框架Netty教程资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
myeclipse开发通信示例,框架netty,代码本人写的,而且已测试通过,先运行NettyService,再运行NettyClient即可看到效果。nio示例也有,原理一样,运行先后顺序同netty.
netty 数据分包、组包、粘包处理机制(部分)1
视频分两部分:第一部分:深入浅出Netty源码剖析;第二部分:NIO+Netty5各种RPC架构实战演练(非加密)
Netty01-nio.md
t-io是基于aio(nio2)的网络编程框架,和netty属于同类,但t-io更注重开发一线工程师的感受,提供了大量和业务相关的API。基于t-io来开发IM、TCP私有协议、RPC、游戏服务器端、推送服务、实时监控、物联网、UDP、...
Netty是一个NIO客户端服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化和简化了TCP和UDP套接字服务器等网络编程。 “快速简便”并不意味着最终的应用程序将遭受可维护性或性能...
NIO与Netty编程-课程讲义,包含 BIO、NIO、Io的介绍,NIO网络聊天的案列,自定义RPC的实现与设计
用Netty实现NIO Socket聊天系统示例 ,完整代码,已开源,希望大家多提意见。
java_Netty权威指南,详解nio,tcp,http,netty.rar
netty 新NIO框架 文档,在jetty项目中用到了该框架。 netty更注重IO读写,效率很高。更支持servlet1.0异步的websocket。值得一看
【项目实战】Netty源码剖析&NIO;+Netty5各种RPC架构实战演练三部曲视频教程(未加密)
如何全面系统地掌握Netty,进行Netty NIO开发、Netty编解码开发、Netty多协议开发?如何通过对Netty源码的学习获得更深入地知识?掌握了Netty后,如何将其应用到实际架构中?Netty工程师的就业前景和可涉足的行业是怎样...
主要介绍了java基于netty NIO的简单聊天室的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧