关于netty的线程? 400 报错
你好:
我看过你的关于netty的帖子。现在我关于netty线程的问题很头大。netty一个连接就是一个work线程。我要做长连接的话,那么就岂不是很多线程。Executors.newCachedThreadPool(),是可伸缩的线程池。如果一个连接过来,不close,保持长连接那么他就会占用一个work线程。其他的请求连接会从线程池拿出一个新的线程来work。这样有多少请求就会多少连接。换成Executors.newSingleThreadExecutor()线程池的话,那么netty只能为一个连接工作了。
mina一个线程就能hold住很多连接。netty如何设置?求指点阿。大哥,抑或是我对Executors.newCachedThreadPool()理解不够。
。。。一样的道理,mina是nio和,netty也是基本nio,所以他长连接并不会hold住线程
nio的工作方式是把一个socket的上载的数据放到一个bytebuffer上,再把这个buffer发送给你工作的线程
之后他再读取下一个的数据
######。。。一样的道理,mina是nio和,netty也是基本nio,所以他长连接并不会hold住线程
nio的工作方式是把一个socket的上载的数据放到一个bytebuffer上,再把这个buffer发送给你工作的线程
之后他再读取下一个的数据
感谢JavaGG的回答 。
但是解释不了用Executors.newSingleThreadExecutor()设置线程池,channel不close的,整个线程都会阻塞,其他连接都不搭理的情况。
谢谢肖冰,leeken的回答。
我再看看吧。
我现在用mina了,mina的IoBuffer没有netty的ChannelBuffer方便,要翻过来翻过去的,
数据经常给翻没了。
有时间继续研究netty,
######我也遇到跟楼主一样的问题,我使用了固定的 线程池,一样会阻塞在那里######ServerBootstrap初始的threadPoolExecutor只是accept的线程池, 一般做法是在业务处理开始加线程处理(org.jboss.netty.handler.execution.ExecutionHandler), 如果pipeline的hander不加ExecutionHanlder, accept只能在处理完一个完全的流程后才返回,read data那边肯定会等待和阻塞######执行ChannelHandler链的整个过程是同步的,如果业务逻辑的耗时较长,会将导致Work线程长时间被占用得不到释放,从而影响了整个服务器的并发处理能力。
所以,为了提高并发数,一般通过ExecutionHandler线程池来异步处理ChannelHandler链(worker线程在经过ExecutionHandler后就结束了,它会被ChannelFactory的worker线程池所回收)
在Netty中,只需要增加一行代码:
public ChannelPipeline getPipeline() {
return Channels.pipeline(
new DatabaseGatewayProtocolEncoder(),
new DatabaseGatewayProtocolDecoder(),
executionHandler, // Must be shared
new DatabaseQueryingHandler());
}
例如:
ExecutionHandler executionHandler = new ExecutionHandler(
new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576))
######难道你们没注意到 channel在handle里不close的话。一个线程根本得不到回收。我要保持长连接阿不能close阿。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。