Java NIO 异步网络构建高性能服务器(一)(原创)

1.问题
构建高性能的服务器时,肯定要求性能越高越好,这是不言自明的道理.那么一般服务器处理客户端请求,都有哪些方式呢?
(1) 最初级的处理方式:用一个ServerSocket进行无限循环来监听,客户端来一个连接就处理一个,后面来的连接则只能等待前面的处理好了才能进行处理,可想而知,如果每个连接处理的处理时间很长,这样的处理在一个客户要求快的响应的情况下会多么糟糕.大家都经常上网,你愿意多等那么10几秒么? 这种情况的代码形式如下:
    ServerSockt serverSocket = ....
while (true) {
Socket socket = serverSocket.accept();
// 处理socket...
}

所以说,很多讲网络编程的书,动不动举的例子就是上面,我真的怀疑这些人做过实际开发没有.在实际应用过程中,很少会使用这种编程开发方式的.
(2) 稍微进步一些的:一客户端一个线程.这中处理的方式是,当来一个客户端时,就新创建一个线程进行处理.代码的方式如下:
   ServerSockt serverSocket = ....
while (true) {
Socket socket = serverSocket.accept();
(new Thead() {
public void run() {
// 处理socket
}
}) .start();
}

// 注意; 我上面敲的代码仅仅是表达意思,如何编写正确的方式,我想就不用多说了把.
可能刚接触这种处理方式的人会觉得,这样真好阿!每个客户端连接都用一个线程来处理,应该性能很高,响应性很好吧.如果连接数非常少的话,上面这种处理方法的确没多大问题.但是,但凡学过操作系统的人都知道,现代操作系统进程是资源分配的基本单位,而进程是调度的基本单位.要知道,调度是需要花费CPU时间的,如果线程数过多,CPU的时间都花费在调度上了,真正用于处理连接的时间则很少,当然,这仅仅是一个方面,线程的创建的会花费时间和一定的内存,这有可能会造成内存耗尽的情况并会影响响应性,而且线程的频繁切换会不能有效的利用高速缓存等等情况.因此,实际工作过程中,很少用这种“一客户端一线程”的方式.
(3)使用线程池。上面已经一客户端一线程的情况下,线程过多时会造成的影响.自然而然的,大家就想到了使用线程池.所谓的线程池处理方法,就是预先创建好一组线程,每个线程都在监听着客户端连接,哪个先监听到连接了,就进行处理.一般代码形式如下:
ServerSocket serverSocket = ….
for ( int i = 0; i < threadNum; i ++) {
Thread t = new Thread() {
public void run() {
while (true) {
Socket clientSocket = serverSocket.accept();
// 处理clientSocket
}
}
};
t.start();
}
使用线程池,线程的是先预先创建的,与客户端数量无关,因此,可以控制线程的调度和相关的资源开销.Doug Lea教授为java贡献的java.util.concurrent包里提供了各种优秀的线程池的实现方式.可以直接使用,不是高手就不要乱重新发明轮子了,线程不是一般人玩的.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值