当前位置: 代码迷 >> J2SE >> java socket多线程有关问题
  详细解决方案

java socket多线程有关问题

热度:167   发布时间:2016-04-23 20:16:43.0
java socket多线程问题
本帖最后由 Anders_Zhuo 于 2014-09-17 09:23:43 编辑
关于java socket多线程问题:

网上很多例子都是同样一个思路:

1 new一个线程池threadpool

2  main函数里面, while(true)    一直ServerScoket来accept新建立的socket

3 将新建立的socket封装到一个runnable,然后交给线程池threadpool来处理


网上关于多线程socket的例子几乎都是这样,

虽然这样支持多个client来同时访问server,但是client的数量就有了限制

那就是线程池的大小,因为将一个socket交给一个runnable的话,当socket 在read的时候,还是在阻塞住这个线程

于是乎,只要socket没有断开,那么最多支持线程池大小个数的client,这是不合理的

请问,对于多线程 socket,有没有其他的解决方法?(不用nio的select模型,只用socket+多线程)

------解决思路----------------------
引用:
Quote: 引用:

本来有nio的好的方案你不用,偏要用socket+多线程,这能怪谁啊。
你能做的就是将线程池中线程数加大,不过这样系统性能将会很低,而且能够支持的并发数很有限。

对于你这种需求,如果用nio性能提升的那根本不是一个档次的。直接搞个nio框架,例如Mina、Netty等,简单又高效。


nio完全没有问题,只是我好奇在有nio之前,java是怎么样写多线程socket的?


就是这么写的。

因为还有其他 方面的原因,一个服务器上面的连接数就是有一定的限制的。你有兴趣可以找一下poll/epoll,这差不多也就是10年前开始的, LInux 的2.6或是linux 2.4的某个内核版本开始的。

从JVM的情况来看,差不多最多可以1000多个Thread,也许调优的好,还可以更多,但应该3000也是极限了。所以,一般Tomcat之类服务器也就是1000多个连接,但这个数字,其基本上也是和当时系统的内核匹配的。
  相关解决方案