2个回答
展开全部
这是肯定的,多线程的网络服务当然会比单线程要慢得多, 每多开启一个线程,系统资源就会多分配一份. 特别地,如果多线程之间需要做到线程同步,那就更慢了.
但是socket服务器是不可以用单线程来处理客户端请求的,因为IO读写操作总是阻塞的,不可能让一个用户总是等另一个用户处理完了才有机会被处理.
异步IO操作是比较好的方法, 如果你需要做的是一些比如网络聊天室, 棋牌游戏等socket服务器, 你可以考虑Apache开源项目MINA框架来做(它封装了NIO), 这个非常简单, 看一下他们的例子程序和说明文档就可以做一个简单的服务端了.
但是socket服务器是不可以用单线程来处理客户端请求的,因为IO读写操作总是阻塞的,不可能让一个用户总是等另一个用户处理完了才有机会被处理.
异步IO操作是比较好的方法, 如果你需要做的是一些比如网络聊天室, 棋牌游戏等socket服务器, 你可以考虑Apache开源项目MINA框架来做(它封装了NIO), 这个非常简单, 看一下他们的例子程序和说明文档就可以做一个简单的服务端了.
追问
我是客户端要多线程...最简单那的那种,一发一收,三十次收发在单线程里,单次收发都很快。
启动三十个线程没个线程都进行收发处理, 单次发收速度却很慢了...到上面的几倍的速度。
追答
是的,这样会很慢, N个线程将会同时抢占IO端口进行通讯。在线程调度,CPU调度,IO调度上都是需要花费时间的。 如果有做同步处理不仅费时,还容易造成死锁。
另外, 我要问一下,你的线程是否有做循环?如果里面有循环的话最好在每次间隔做一个小小的休眠,这样能给别的线程一些机会去执行。
总体来说,做客户端的网络模块,你应该以队列形式处理,
1。 UI操作和主逻辑处理是一个单独的线程,不要做任何通讯的工作。
2。 单独开一个写网络线程,该线程每休眠一定时间就会扫描写数组队列有没有请求要发送到服务端,有的话就将从队列头部拿出一个执行发送。 UI主线程接受用户操作与这个网络线程没有关系,当需要发送网络消息时需要包装一下将请求发送到这个队列的尾部。
3。 再单独开一个读网络线程,该线程每休眠一定时间就会扫描IO端口是否有可读的数据进来,如果有则处理之,根据消息包的定义可以知道当初这个消息是哪个模块发送到服务端并由服务端返回来交给谁处理的, 因为可以采用回调的形式执行你的逻辑代码。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询