socket通信线程数问题 用java + as搞了个socket通信,线程池用Executors,发现我定义了多少个线程,就只能接受多少个会员,如果有2000个会员,就得定义2000个线程吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 竟然用了Executors,没必要这么多啊,线程池中线程可以重用,设置动态策略,访问多的时候,逐渐增加到一个峰值,空闲的时候销毁部分,类型tomcat的连接策略。 2000 个线程?不可能的!操作系统对于每个进程所能开启的线程数是有限制的,默认情况下 Windows 是 2000 个左右,Linux 是 1000 个左右,另外一个线程默认情况下会占用 1MB 大小的内存空间。所以你设置 2000 个线程的话,会很危险,可能会导致 JVM 崩溃。2000 个人在线的话,没有必要设置 2000 个线程。一个用户也不可能连续地进行请求,有 100 个线程就足够了。 楼主需求是一种长连接环境么?请使用NIO技术,单个线程处理大量Socket连接。线程数量不建议配置太多,如4楼所说,一般推荐是 CPU 核数×2左右即可;太多了反而严重浪费线程切换的开销。 另论上服务器接收socket的数量是没有限制的(多了只会占用内存),但是你要考虑你服务器的并发能力(也就是线程池大小)。有2000个不代表要创建2000个线程,这样空闲时会造成大量的线程浪费。而且一个请求就创建一个线程效率差,比较创建线程挺耗资源的,尤其当请求处理本身耗时不多时。 核心问题是:你应用的通讯模型,是基于TCP长期保持连接的模型,还是类似于HTTP这种(它通讯协议也是TCP)采用短连接(一次交互完成后就会close)?如果是基于长期保持连接的,那么线程就需要为其持续提供服务;这种情况下可以用NIO模型,甚至一个线程同时服务100个Socket连接;其实,很多海量连接规模的服务,都是采用NIO模型,比如ApacheWebServer。如果不是,就类似于中间件(如Tomcat)可以用更少的线程,服务很多所谓的并发请求,但其实是轮流处理,只不过单个请求处理速度很快;过程就类似于:接获请求-->线程池分配-->线程处理-->关闭连接-->归还线程池。 基于TCP长期保持连接的模型,我先看看NIO怎么弄,呵呵,先谢谢啦 其实不是Java发明的,人家早就用烂了的技术,只是Java引入的慢;所以感觉上理念新鲜点。基于事件处理机制,所有的连接、请求等都是一个事件,相当于你写一个事件处理器,循环处理各Socket的各种请求;不太复杂,找个例子看看就行了。 MyEclipse常用快捷键 为什么输出会是这样的?需要帮助 如何执行cmd http://abc.com/autologin.php?user=abc&pwd=bcd后不打开浏览器 程序什么地反有错 关于stringbuffer的一个问题 有点奇怪的运行结果! 写一个带下拉箭头的按钮 如何在程序中判断一个文件夹中有多少个文件? Frame的嵌套怎么搞? 对于继承的一些疑问,请大神解答 哪位大神,能细细讲一下页面加载的过程 java中 Lock和 Condition关系
核心问题是:你应用的通讯模型,是基于TCP长期保持连接的模型,还是类似于HTTP这种(它通讯协议也是TCP)采用短连接(一次交互完成后就会close)?如果是基于长期保持连接的,那么线程就需要为其持续提供服务;这种情况下可以用NIO模型,甚至一个线程同时服务100个Socket连接;其实,很多海量连接规模的服务,都是采用NIO模型,比如ApacheWebServer。如果不是,就类似于中间件(如Tomcat)可以用更少的线程,服务很多所谓的并发请求,但其实是轮流处理,只不过单个请求处理速度很快;过程就类似于:接获请求-->线程池分配-->线程处理-->关闭连接-->归还线程池。
其实不是Java发明的,人家早就用烂了的技术,只是Java引入的慢;所以感觉上理念新鲜点。基于事件处理机制,所有的连接、请求等都是一个事件,相当于你写一个事件处理器,循环处理各Socket的各种请求;不太复杂,找个例子看看就行了。