8.阻塞/非阻塞 同步/异步

值得注意的是:

  • 阻塞非阻塞是针对进程或者线程的调用结果来说的.
  • 而同步或者非同步则是针对代码的调用结果来说.

阻塞

文件读取操作

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 方法来说, 站在线程角度来看, 就是阻塞的; 站在调用角度来看, 就是同步的, 因为这个方法没有执行完是不能继续执行的.

异步就是说不管这个方法内部是如何操作的, 只要被调用方法没有执行完, 后续代码会被执行, 就是异步.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值