NIO

  nio,java.nio全称java non-blocking IO,非阻塞式的,java非阻塞式IO又称new io

  NIO和IO到底有什么区别?有什么关系?

首先说一下核心区别:
  例如serverSocket编程,服务端阻塞后,等待客服端接入。这就是阻塞io。此时两处阻塞,等待客服端接入阻塞,接入后,等待客户端传入数据,又阻塞.

  NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。
  NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。
  还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。
  还有就是NIO的缓冲区(其实也就是一个字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区很明显就是字面意思,直接缓冲区是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。

  补充一点:NIO比传统的BIO核心区别就是,NIO采用的是多路复用的IO模型,普通的IO用的是阻塞的IO模型,两个之间的效率肯定是多路复用效率更高

  NIO中的三个重要组件:
  1. 缓冲区Buffer
  2. 通道Channel
  3. 选择器Selector

传统的IO与Channel的区别
  1.传统的IO是BIO(blocking io)的,而Channel是NIO的。
*当流调用了read()、write()方法后会一直阻塞线程直到数据被读取或写入完毕。
  2.传统IO流是单向的,而Channel是双向的。

补充:
  1.内存分为内核区,用户区,用户区不能直接访问io硬件,要通过内核
  2.超线程,有时称为同时多线程(simultaneous multi-threading),是一项允许一个CPU执行多个控制流的技术,它涉及CPU的某些硬件有多个备份,比如程序计数器和寄存器文件;而其他的硬件部分只有一份,比如浮点算数运算的单元。常规的处理器需要大约20000个时钟周期做不同线程间的转换,而超线程的处理器可以再单个周期的基础上决定要执行哪一个线程。这使得CPU能够更好的利用它的处理器资源。例如一个线程必须等到被装载到高速缓存中,那CPU就可以继续去执行另一个线程。举例来说,Intel core i7处理器可以让一个核执行两个线程,所以一个4核的系统实际上可以并行地执行8个线程。

你可能感兴趣的:(闫同学的Java学习,java,nio,并发编程)