Netty学习-Java网络编程

本文探讨了Java网络编程中的同步阻塞IO与非阻塞IO(NIO)的区别,详细介绍了两种方式的工作原理及应用场景,特别是NIO如何利用Selector实现高效的IO处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阻塞与非阻塞

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

异步与同步

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值