文字虽多,只要你一步一步往下看就能理解。
概念:
1.同步:调用发出后,调用者要一直等待返回结果,得到通知后,才能进行后续的执行;
2.异步:调用发出后,调用者不能立刻得到返回结果,执行部件在完成后,通过状态、通知和回调方式来通知调用者;
3.阻塞:调用结果返回前,当前线程被挂起,一直处于等待消息通知,不能够执行其他业务,只有在得到结果后才会返回;
4.非阻塞:在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回(不是想要的结果)。
通知的方式:
1.状态:即监听被调用者的状态(轮询),调用者需要每隔一定时间检查一次,效率会很低。
2.通知:当被调用者执行完成后,发出通知告知调用者,无需消耗太多性能。
3.回调:与通知类似,当被调用者执行完成后,会调用调用者提供的回调函数
使用哪一种通知机制,依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。
同步/异步 和 阻塞/非阻塞的区别:
可以理解为关注的对象不同:
1.同步/异步:数据未就绪,是否等待返回结果;
2.阻塞/非阻塞:数据未就绪,是否要阻塞线程;
场景比喻:
我去银行办理业务,可能会有两种方式:
1.选择排队等候;(同步)
2.选择取自己的候码牌,轮到我时由柜台的人通知我去办理业务;(异步)
就有以下4种模式:
1.如果选择排队(同步),且排队的时什么都不干(线程被挂起,什么都干不了),是同步阻塞模型;
2.如果选择排队(同步),但排队的同时做与办银行业务无关的事情,比如玩手机,(线程未被挂起,还可以干其他的事)是同步非阻塞模型;
3.如果选择候码牌,坐在位置上等柜台叫号(状态、通知和回调),但是坐在位置上什么都不干(线程被挂起,什么都干不了),这是异步阻塞模型;
4.如果选择候码牌,坐在位置上等柜台叫号(状态、通知和回调),但坐着的同时还玩手机打游戏(线程没有被挂起,还可以干其他事情),这是异步非阻