码迷,mamicode.com
首页 > 编程语言 > 详细

深入Java网络编程与NIO(二)

时间:2018-11-27 23:22:12      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:put   还需要   log   capacity   ima   多个   com   要求   direct   

Java NIO 学习总结

NIO的特性/NIO与IO区别:

  • 1)IO是面向流的,NIO是面向缓冲区的;
  • 2)IO流是阻塞的,NIO流是不阻塞的;
  • 3)NIO有选择器,而IO没有。

读数据和写数据方式:

  • 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
  • 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

NIO三大核心组件:Channels 、Buffers 、Selectors

1.Buffers

技术分享图片
其实核心是最后的 ByteBuffer,前面的一大串类只是包装了一下它而已,我们使用最多的通常也是 ByteBuffer。
MappedByteBuffer 用于实现直接内存映射mmp。

Buffer 和数组差不多,它有 position、limit、capacity 几个重要属性。put() 一下数据、flip() 切换到读模式、然后用 get() 获取数据、clear() 一下清空数据、重新回到 put() 写入数据。

(1)mmp 和 Direct Buffer

2.Channels

技术分享图片

FileChannel:文件通道,用于文件的读和写
DatagramChannel:用于 UDP 连接的接收和发送
SocketChannel:把它理解为 TCP 连接通道,简单理解就是 TCP 客户端
ServerSocketChannel:TCP 对应的服务端,用于监听某个端口进来的请求

(1)

3.Selectors

Selector 建立在非阻塞的基础之上,大家经常听到的多路复用世界中指的就是它,用于实现一个线程管理多个 Channel。

对于 Selector,我们还需要非常熟悉以下几个方法:

1. select()

调用此方法,会将上次 select 之后的准备好的 channel 对应的 SelectionKey 复制到 selected set 中。如果没有任何通道准备好,这个方法会阻塞,直到至少有一个通道准备好。

2. electNow()

功能和 select 一样,区别在于如果没有准备好的通道,那么此方法会立即返回 0。

3. select(long timeout)

看了前面两个,这个应该很好理解了,如果没有通道准备好,此方法会等待一会

4. wakeup()

这个方法是用来唤醒等待在 select() 和 select(timeout) 上的线程的。如果 wakeup() 先被调用,此时没有线程在 select 上阻塞,那么之后的一个 select() 或 select(timeout) 会立即返回,而不会阻塞,当然,它只会作用一次。

深入Java网络编程与NIO(二)

标签:put   还需要   log   capacity   ima   多个   com   要求   direct   

原文地址:https://www.cnblogs.com/shawshawwan/p/10029678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!