值得注意的是:
- 阻塞非阻塞是针对进程或者线程的调用结果来说的.
- 而同步或者非同步则是针对代码的调用结果来说.
阻塞
文件读取操作
File file = new File("D:\\iotest.txt");
InputStream in = new FileInputStream(file);
byte[] bytes = new byte[10];
int c;
while((c=in.read(bytes))!=-1) {
System.out.println(Arrays.toString(bytes));
}
在当前线程中使用 read
方法读取文件时, 必须要等待读取指定字符后, 代码才能继续向下执行. 这种操作就是阻塞.
在比如在做 BIO 服务端开发中, 会使用 accept()
方法, 等待客户端链接.
当客户端链接后才会去创建一个 Handler
来处理客户端发送的数据.
while (flag) {
Socket client = socket.accept();
executorService.submit(new EchoClientHandler(client));
}
等待的这段时间, 线程就会被阻塞. 反之就是非阻塞.
我们所说的 “阻塞”是指进程在发起了一个系统调用(System Call)后, 由于该系统调用的操作不能立即完成, 需要等待一段时间, 于是内核将进程挂起为等待 (waiting)状态, 以确保它不会被调度执行, 占用 CPU 资源.
同步
还是使用 read
方法来说, 站在线程角度来看, 就是阻塞的; 站在调用角度来看, 就是同步的, 因为这个方法没有执行完是不能继续执行的.
异步就是说不管这个方法内部是如何操作的, 只要被调用方法没有执行完, 后续代码会被执行, 就是异步.