一. 什么是阻塞?
阻塞(Block)这个概念。当进程调用一个阻塞的系统函数时,该进程被置于睡眠(Sleep)状态,这时内核调度其它进程运行,直到该进程等待的事件发生了(比如网络上接收到数据包,或者调用sleep指定的睡眠时间到了)它才有可能继续运行。
我自己是这样理解(同步/异步、阻塞/非阻塞)的:
所谓同步就是当一个进程发起一个函数(任务)调用的时候,一直会到函数(任务)完成。进程继续往下执行。而异步这不会这样,异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件。等方式通知进程任务完成。
而阻塞和非阻塞的概念相对明了多了。阻塞是当请求不能满足的时候就试进程挂起,非阻塞则是直接返回。
二.NIO包
java.nio包是Java在1.4之后增加的,用来提高I/O操作的效率。在nio包中主要包括以下几个类或接口:
* Buffer:缓冲区,用来临时存放输入或输出数据。
* Charset:用来把Unicode字符编码和其它字符编码互转。
* Channel:数据传输通道,用来把Buffer中的数据写入到数据源,或者把数据源中的数据读入到Buffer。
* Selector:用来支持异步I/O操作,也叫非阻塞I/O操作。
nio包中主要通过下面两个方面来提高I/O操作效率:
* 通过Buffer和Channel来提高I/O操作的速度。
* 通过Selector来支持非阻塞I/O操作。
三. 代码示例(文件读写 & socket通讯)
以下是 BIO,和NIO的 文件读写、socket通讯,大家可以对比下有什么不一样
BIO:
public class FileIODemo {
public static void main(String[] args) {
//获取文件
File fileRead = new File("fileIORead.txt");
File fileWrite = new File("fileIOWrite.txt");
//字节流
try {
FileInputStream input=new FileInputStream(fileRead);
FileOutputStream out=new FileOutputStream(fileWrite);
//缓冲数组
byte[] buffer=new byte[10];
int i=0;
while(input.read(buffer)!=-1){
System.out.println("i:"+i++);
out.write(buffer);
}
input.close();
out.close();
} catch (FileNotFoundException e) {
e.printSta