一、Java的IO方式
①传统的java.io基于流模型,如File抽象输入输出流。交互的方式是同步阻塞的方式。在读写动作完成之前,线程会一直堵塞在那里,它们之间的调用是可靠的线形顺序。java.io的好处是代码比较简单,缺点是效率和扩展性存在局限性,容易称为应用性能的瓶颈。
②在Java1.4的NIO框架,提供了Channel、Selector、Buffer等新的抽象,可以构建多路复用,同步非阻塞IO程序,同时提供了更接近底层的高性能数据操作方式。
③在Java7中,NIO有了进一步的改进,也就是NIO2,引入了异步非阻塞IO方式,也有很多人叫它AIO。异步IO操作基于事件和回调机制,可以简单的理解为,应用操作直接返回,而不会阻塞在那里,后台处理完成,操作系统会通知相应线程。
二、线程知识的基本概念
同步与非同步
同步:同步是一种可靠的有序运行机制,当我们进行同步操作时,后续任务是等待当前调用返回,才会进行下一步。
异步:其他任务不需要等待当前调回,通常依靠事情、回调等机制实现任务次序关系。
阻塞与非阻塞
阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务。
非阻塞:不管操作是否结束,直接返回。
NIO
Buffer:高效的数据容器(除布尔)。
Channel:是NIO中被用来支持批量式IO操作的一种抽象。
Selector:是NIO实现多路复用的基础,它提供了一种高效的机制。检测Channel是否处于就绪状态。
Chartset:提供Unicode字符串定义。
三、NIO的多路复用机制
①首先,通过Selector.open()创建一个Selector作为类似于调度员的角色。
②然后,创建一个ServerSocketChannel,并且向Selector注册,通过指定的Selection.OP_ACCEPT,告诉调度员,它关注的是最新的连接请求。
③Selector阻塞在Select操作,当有Channel发生接入请求,就会被唤醒
④通过SocketChannel和Buffer进行数据操作。