java nio初探
2016-02-19 16:15
555 查看
在讲java nio之前,先讲一下io模型,我也是刚刚在网上看的博客学习的,在这里总结一下,有理解不正确的地方,欢迎指正。
同步指的是有多个任务的时候,需要一件件的按顺序执行,不能穿插进行。异步就是可用同时进行。
阻塞指的是在做某件事情的时候,发现条件不足,但是线程会一直等待直到满足条件。而非阻塞则是在条件不满足时返回一个标志信息告诉线程条件不满足而不会一直等待。
当用户线程发起一个IO请求操作(本文以读请求操作为例),内核会去查看要读取的数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪;对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪。
海子把IO读操作分为两个部分:
(1)查看数据是否就绪
(2)内核将数据拷贝到用户线程
阻塞和非阻塞指的就是第一个部分--查看数据是否就绪的时候。
而异步IO为 如果一个线程请求进行IO操作,IO操作不会导致请求线程被阻塞。
事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的:
对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
这是同步IO和异步IO关键区别所在,同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。
也就是上面说的
2、非阻塞IO模型
3、多路复用IO模型
java nio
4、信号驱动IO模型
在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。
5、异步IO模型
而线程池占用的资源少,但是当很多连接都是长连接时,会造成用户体验差
同步,异步,阻塞,非阻塞
首先讲一下我们经常听到的几个名词:同步,异步,阻塞,非阻塞同步指的是有多个任务的时候,需要一件件的按顺序执行,不能穿插进行。异步就是可用同时进行。
阻塞指的是在做某件事情的时候,发现条件不足,但是线程会一直等待直到满足条件。而非阻塞则是在条件不满足时返回一个标志信息告诉线程条件不满足而不会一直等待。
阻塞IO和非阻塞IO
我们还会听到阻塞IO和非阻塞IO:当用户线程发起一个IO请求操作(本文以读请求操作为例),内核会去查看要读取的数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直在那等待,直到数据就绪;对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前要读的数据没有就绪。
海子把IO读操作分为两个部分:
(1)查看数据是否就绪
(2)内核将数据拷贝到用户线程
阻塞和非阻塞指的就是第一个部分--查看数据是否就绪的时候。
同步IO和异步IO:
同步IO即 如果一个线程请求进行IO操作,在IO操作完成之前,该线程会被阻塞;而异步IO为 如果一个线程请求进行IO操作,IO操作不会导致请求线程被阻塞。
事实上,同步IO和异步IO模型是针对用户线程和内核的交互来说的:
对于同步IO:当用户发出IO请求操作之后,如果数据没有就绪,需要通过用户线程或者内核不断地去轮询数据是否就绪,当数据就绪时,再将数据从内核拷贝到用户线程;
而异步IO:只有IO请求操作的发出是由用户线程来进行的,IO操作的两个阶段都是由内核自动完成,然后发送通知告知用户线程IO操作已经完成。也就是说在异步IO中,不会对用户线程产生任何阻塞。
这是同步IO和异步IO关键区别所在,同步IO和异步IO的关键区别反映在数据拷贝阶段是由用户线程完成还是内核完成。所以说异步IO必须要有操作系统的底层支持。
五种IO模型
1、阻塞IO模型也就是上面说的
2、非阻塞IO模型
3、多路复用IO模型
java nio
4、信号驱动IO模型
在信号驱动IO模型中,当用户线程发起一个IO请求操作,会给对应的socket注册一个信号函数,然后用户线程会继续执行,当内核数据就绪时会发送一个信号给用户线程,用户线程接收到信号之后,便在信号函数中调用IO读写操作来进行实际的IO请求操作。
5、异步IO模型
线程池和多线程的缺点:
首先多线程的话会占用大量的资源。而线程池占用的资源少,但是当很多连接都是长连接时,会造成用户体验差
相关文章推荐
- Spring AOP self-invocation及其他问题汇总
- java注释@interface的用法
- java中的sleep()和wait()的区别
- 集成maven和Spring boot的profile功能
- java.lang.SecurityException: Binder invocation to an incorrect interface报错问题
- Eclipse项目导入Android Studio
- spring注入
- 对之前所提到的sigar的介绍进行补充
- 关于 Java中switch条件是否能为string类型
- 深入理解Java:注解(Annotation)--注解处理器
- 详细分析spring与struts2的整合原理
- 深入理解Java:注解(Annotation)自定义注解入门
- Java内存管理
- javaWeb中表示路径的字符串里面首斜杠'/'是什么意思
- 蓝桥杯(Java) 入门训练 序列求和
- hdu2564 java
- 如何修改Myeclipse的JSP模板
- Eclipse--android studio 项目转移(移植)
- 深入理解Java:注解(Annotation)基本概念
- java线程的wait方法和notify方法的运用