为什么每个线程都需要在 netty 中执行 Selector.select
why Every Thread need to execute Selector.select In netty
在阅读Netty-4.0.0.Final.jar的源代码时,发现NioEventLoop.java中有如下令人费解的代码:
protected void run() {
for (;;) {
oldWakenUp = wakenUp.getAndSet(false);
try {
if (hasTasks()) {
selectNow();
} else {
select();
if (wakenUp.get()) {
selector.wakeup();
}
}
//ignore some code
processSelectedKeysPlain(selector.selectedKeys());
//ignore some code
}
}
在传统的网络程序中,使用一个专门的线程来接收就绪事件(accept connection, read, write),并使用一个线程池来提供服务。
我明白了。
netty 也遵循这种模式。
使用
ServerBootstrap.group(EventLoopGroup parentGroup, EventLoopGroup childGroup)
不是
ServerBootstrap.group(EventLoopGroup group)
感谢回复!
In traditional network program, use one dedicated thread to accept
connection and use a pool of threads to provide service.
这是因为接受连接部分是阻塞的,它需要在一个线程中完成,以便可以与服务器建立连接,并且连接处理(读取,写入)必须委托给不同的线程来保持事情运行.
why netty choose to mix the task of accepting and providing service In
every Thread?
这是因为它使用了 java.nio
(非阻塞 I/O)包中的 select
。 Select 自 C/C++ 以来一直存在,它允许同步 I/O 多路复用。简而言之,它允许监视多个套接字并检查这些套接字是否正在读取、写入或是否有异常。
由于 select
的非阻塞性质,它可用于检查连接以及在单线程中处理这些连接。
在阅读Netty-4.0.0.Final.jar的源代码时,发现NioEventLoop.java中有如下令人费解的代码:
protected void run() {
for (;;) {
oldWakenUp = wakenUp.getAndSet(false);
try {
if (hasTasks()) {
selectNow();
} else {
select();
if (wakenUp.get()) {
selector.wakeup();
}
}
//ignore some code
processSelectedKeysPlain(selector.selectedKeys());
//ignore some code
}
}
在传统的网络程序中,使用一个专门的线程来接收就绪事件(accept connection, read, write),并使用一个线程池来提供服务。
我明白了。
netty 也遵循这种模式。 使用
ServerBootstrap.group(EventLoopGroup parentGroup, EventLoopGroup childGroup)
不是
ServerBootstrap.group(EventLoopGroup group)
感谢回复!
In traditional network program, use one dedicated thread to accept connection and use a pool of threads to provide service.
这是因为接受连接部分是阻塞的,它需要在一个线程中完成,以便可以与服务器建立连接,并且连接处理(读取,写入)必须委托给不同的线程来保持事情运行.
why netty choose to mix the task of accepting and providing service In every Thread?
这是因为它使用了 java.nio
(非阻塞 I/O)包中的 select
。 Select 自 C/C++ 以来一直存在,它允许同步 I/O 多路复用。简而言之,它允许监视多个套接字并检查这些套接字是否正在读取、写入或是否有异常。
由于 select
的非阻塞性质,它可用于检查连接以及在单线程中处理这些连接。