同步,异步,阻塞,非阻塞
同步和阻塞:
完成一件事,需要调用a1,a2,a3方法,a1在执行的情况下,a2,a3不能执行,
异步和非阻塞:
完成一件事,需要调用a1,a2,a3方法,a1在执行的情况下,a2,a3也可以执行
同步阻塞:
完成一件事,需要调用a1,a2,a3方法,a1在执行的情况下,a2,a3不能执行,调用a1的线程不能动,必须等到a1执行完(调用线程就是a1的执行线程)
同步非阻塞:
完成一件事,需要干a1,a2,a3这些事,a1在执行的情况下,a2,a3不能执行,调用a1的线程是活动的,就是a1在执行时,可以调用a2或者a3,但是为了同步 他不能干其他事,只能轮询看a1有没有执行完(调用线程与a1的执行线程不一样)
异步
(个人认为)首先我认为异步没有阻塞和非阻塞
完成一件事,需要调用a1,a2,a3方法,a1在执行的情况下,a2,a3也可以执行 ,就是一个线程调用a1,a2,a3时不会立马执行,但是会交给其他线程执行(a1,a2,a3的执行线程都可以是调用线程,也可以不是),自己可以设置钩子,来让执行a1,a2,a3的线程进行回调
异步就是内部进行一下包装,a1,a2,a3的执行跟彼此无关的,不知道谁先执行,谁后执行,反正最后回调钩子函数
总结
同步,异步都是逻辑上的概念,实现方式自己定
阻塞和非阻塞就是具体的东西
NIO
NIO里面的FileChannel是同步的
NIO 叫做NEW IO ,提出了新的概念,引入多路选择器Selector,Channel和Bytebuffer
名词
Channel
一个IO流的通道
1 | //具备一个IO操作能力,一旦closed,任何IO操作都会报异常 |
Buffer
1 | Buffer.class |
selector
一个多路复用器,一个具备多路复用能力的Channel在该selector上的注册信息就是一个SelectionKey对象,selector具有三组 selection keys
key 集合 在该selector注册channel都会被拿出来,keys()可以获取
selected-key集合,key的子集,key集合的任意一个key的channel被检测到有 operations(key感兴趣的ops,就是在注册时需要指定的ops)确认信息,就会被放到selected-key集合,selectedKeys() 可以获取,通过获取该集合的迭代器 调用remove方法可以从selected-key集合直接移除当前遍历到的key
cancelled-key集合,key的子集,key集合的任意一个key被cancelled或者key的channel被close了,但是key的channel还没有被注销调,都被被放到selected-key集合,该集合不能直接被访问,这里面的key将不会参与下次 selection operations,并且移除keys集合对应再cancelled-key集合的key
1 |
|
SelectionKey
是一个 SelectableChannel注册再Selector上的一个令牌,标识,叫做selection key
1 | channel(); 返回当前selection key的Channel |
- 本文作者: 忘忧症
- 本文链接: https://NepenthesZGW.github.io/2020/06/20/framework/Netty/NIO/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!