日期:2014-05-20  浏览次数:20736 次

socket通信线程数问题
用java + as搞了个socket通信,线程池用Executors,发现我定义了多少个线程,就只能接受多少个会员,如果有2000个会员,就得定义2000个线程吗?

------解决方案--------------------
竟然用了Executors,没必要这么多啊,线程池中线程可以重用,设置动态策略,访问多的时候,逐渐增加到一个峰值,空闲的时候销毁部分,类型tomcat的连接策略。
------解决方案--------------------
2000 个线程?

不可能的!操作系统对于每个进程所能开启的线程数是有限制的,默认情况下 Windows 是 2000 个左右,Linux 是 1000 个左右,另外一个线程默认情况下会占用 1MB 大小的内存空间。

所以你设置 2000 个线程的话,会很危险,可能会导致 JVM 崩溃。

2000 个人在线的话,没有必要设置 2000 个线程。一个用户也不可能连续地进行请求,有 100 个线程就足够了。
------解决方案--------------------
我想是这样的:从现象上看,应该是线程没有复用。也就是说,严格实现了一个线程为一个会员服务,那么当所有的线程都被占用了(在线会员数等于线程数上线),新的会员就登录不上了。这里面需要区分的问题是,线程并不等于连接,用一个线程为某个会员服务并不等于除非这个会员下线线程才能空闲。考虑到一个服务线程并不是一直处于处理服务请求的过程中,而是有很多空闲,所以,一个服务线程处理完一个服务请求后,可以立即交还回线程池,而不是等着会员下线了才交还。大概就是这样的。
------解决方案--------------------
楼主需求是一种长连接环境么?请使用NIO技术,单个线程处理大量Socket连接。

线程数量不建议配置太多,如4楼所说,一般推荐是 CPU 核数×2左右即可;太多了反而严重浪费线程切换的开销。