- 参考链接
同步与异步
- 同步与异步关注的是消息通信机制:被调用者是否有回传功能在任务结束时通知调用者
同步
- 同步:就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了
- 比如写一个函数调用另一个函数,必须等待返回结果才继续下一步骤,因为同步调用是被调用者没有回调通知的功能,所以必须等
异步
- 异步:调用在发出之后,这个调用就直接返回了,所以没有返回结果
- 调用者不会立刻得到结果,被调用者完成工作后会通知调用者【通过回调函数等方式】
- 比如在Future和Callable配合使用时
- 调用者可以启动Callable对应的线程执行任务,然后马上返回,获取到一个Future对象
- Callable完成工作后,会将返回值存放到Future【相当于一个回调】
- 调用者可以通过检查Future对象,调用其.get()方法得到返回值
- 【如果没有返回的话,会被阻塞,但是启动任务和调用get()期间,调用者是可以做自己的事情的,所以是异步非阻塞调用,然后get()阻塞式接受结果】
区别分析
- 同步与异步的重点区别在于是否有返回通知的功能:https://www.zhihu.com/question/26393784/answer/513257548
- 是否马上返回感觉只是一个附属的结论,因为异步能通知,所以才能马上离开
阻塞与非阻塞
- 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态:被调用者是否被阻塞
阻塞
- 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
- 如果被调用者没有完成工作,就一直等待
非阻塞
- 非阻塞:非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
- 如果被调用者还没有完成工作,就返回默认值
区别分析
- 同步与异步的区别在于等待结果时的状态:https://www.zhihu.com/question/19732473/answer/20851256
写在最后
- 同步一般伴随着阻塞,因为同步时不等待的话拿不到结果
- 没见过同步的非阻塞是调用,除非是不需要结果的调用,只是为了发送一个通知给被调用者
- 异步一般伴随着非阻塞,不然就浪费了异步的功能
- 异步调用后可以选择两种调用拿到结果
- 阻塞式get + 轮训
- 阻塞式get
- 异步调用后可以选择两种调用拿到结果