Netty学习-Java网络编程

来源:互联网 发布:系统优化的方法论 编辑:程序博客网 时间:2024/06/06 18:09

阻塞与非阻塞

我们最初接触到的java网络编程往往是同步阻塞的IO。
同步阻塞和同步非阻塞的区别在于接收数据的时候。同步阻塞采用接收到一个客户端的接入请求,开启一个线程,然后这个线程等待客户端发送信息,在等待的过程中采用阻塞。这样的做法我们发现每一个客户端的接入,我们就需要开启一个线程来管理消息的接收和发送,如果客户端没有消息发过来,那么这个线程一直会阻塞在接收消息这个地方,这样的话会造成很大的资源浪费,对于少量的多线程请求还是能承受得了的。但是如果有上10万或者上百万的请求,那么服务器就会崩溃。所以java又诞生了同步非阻塞IO,就是java的NIO。NIO采用一个选择器来读写客户端的请求,一个Selector选择器上注册了多个客户端的socket管道,通过事件通知API(也称为IO多路复用)来确定一组非阻塞套接字中有哪些已经绪IO操作,然后seletor得到这些socket,最后进行读写操作。Selector的一个线程完成了多个socket请求的IO操作,减少了内存空间和上下文切换带来的开销。
总之,阻塞和非阻塞的区别是,阻塞会在没有收到套接字可读写数据的时候进行阻塞,也就是说在该点流停止了;而非阻塞在没有收到套接字可读写数据的时候去做其他的事。

异步与同步

而异步和同步又有什么区别呢?我们在NIO中看到,我们如果扫描到了有可读的IO事件,然后我们再进行读写,我们在读写的过程中是不能去干其他的事,而异步则是我们开始IO操作,然后我们可以去干别的事,等到IO操作结束后,通过一个回调来通知我们。

原创粉丝点击