java工作线程在Netty中被阻塞
我知道netty使用Reactor模式来避免为每个连接创建线程,
这个模式的核心概念是Linux中的“选择器”或epoll
系统调用
但我也听说,如果处理程序从不关闭其通道,它将占用一个工作线程并阻止它:这难道不意味着每个连接将使用(阻止)一个线程,所以对于每个接受的socket,我们仍然需要创建一个线程吗
例如,如果我编写一个具有10000个持久连接的服务器,这个服务器是否需要10000个工作线程
这两件事之间的矛盾让我困惑,如果我理解错了,有人能解释我吗?谢谢~
========================================
例如(只有一个工作线程),它总是可以同时处理一个客户端的事件
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
public class Netty_test {
public static void main(String[] args) {
ChannelFactory factory =new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newFixedThreadPool(1));
ServerBootstrap bootstrap = new ServerBootstrap(factory);
ChannelPipelineFactory cpf=new ChannelPipelineFactory(){
public ChannelPipeline getPipeline() {
return Channels.pipeline(new testHandler());
}
};
bootstrap.setPipelineFactory(cpf);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.bind(new InetSocketAddress(100));
}
}
class testHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
System.out.println("messageReceived, handler work.");
e.getChannel().write(e.getMessage());
ctx.sendUpstream(e);
}
}
# 1 楼答案
不,您的10000个连接将共享工作线程。一个工作线程将处理多个连接/通道。这就是为什么不阻塞辅助线程非常重要的原因
# 2 楼答案
1)在reactor模式中,调度器通过侦听事件队列列表并将事件传递给具体的事件处理程序来获取一个事件。事件处理程序只能由一个线程、线程池或每个线程的每个事件执行。取决于你的实现
2)您可以为每个通道添加超时计时器,并在传入数据上重置此计时器。如果计时器超时,则关闭此通道,以防止空闲通道过多
我的0.2美分