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

解决方案 »

  1.   

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

  2.   

    2000 个线程?不可能的!操作系统对于每个进程所能开启的线程数是有限制的,默认情况下 Windows 是 2000 个左右,Linux 是 1000 个左右,另外一个线程默认情况下会占用 1MB 大小的内存空间。所以你设置 2000 个线程的话,会很危险,可能会导致 JVM 崩溃。2000 个人在线的话,没有必要设置 2000 个线程。一个用户也不可能连续地进行请求,有 100 个线程就足够了。
      

  3.   

    楼主需求是一种长连接环境么?请使用NIO技术,单个线程处理大量Socket连接。线程数量不建议配置太多,如4楼所说,一般推荐是 CPU 核数×2左右即可;太多了反而严重浪费线程切换的开销。
      

  4.   

    另论上服务器接收socket的数量是没有限制的(多了只会占用内存),但是你要考虑你服务器的并发能力(也就是线程池大小)。有2000个不代表要创建2000个线程,这样空闲时会造成大量的线程浪费。而且一个请求就创建一个线程效率差,比较创建线程挺耗资源的,尤其当请求处理本身耗时不多时。
      

  5.   


    核心问题是:你应用的通讯模型,是基于TCP长期保持连接的模型,还是类似于HTTP这种(它通讯协议也是TCP)采用短连接(一次交互完成后就会close)?如果是基于长期保持连接的,那么线程就需要为其持续提供服务;这种情况下可以用NIO模型,甚至一个线程同时服务100个Socket连接;其实,很多海量连接规模的服务,都是采用NIO模型,比如ApacheWebServer。如果不是,就类似于中间件(如Tomcat)可以用更少的线程,服务很多所谓的并发请求,但其实是轮流处理,只不过单个请求处理速度很快;过程就类似于:接获请求-->线程池分配-->线程处理-->关闭连接-->归还线程池。
      

  6.   

    基于TCP长期保持连接的模型,我先看看NIO怎么弄,呵呵,先谢谢啦
      

  7.   


    其实不是Java发明的,人家早就用烂了的技术,只是Java引入的慢;所以感觉上理念新鲜点。基于事件处理机制,所有的连接、请求等都是一个事件,相当于你写一个事件处理器,循环处理各Socket的各种请求;不太复杂,找个例子看看就行了。