同步方法方便程序员使用和理解,因为方法的返回时机是在方法完成之后,能够得到明确的结果。
异步方法却不是太好理解,因为方法一调用,就立马返回得到一个方法调用存根,比如Futrue对象,虽然我们能够使用这个Future对象来等待任务执行完成,但真正何时调用,我们确实不得而知。
在我们编程开发中,大部分情况是同步方法的,因为同步方法容易理解,编程友好,所以,大部分都是这样的,只有少部分是异步的。
同步方法的内部原因还是分许多情况的,如:
1.阻塞式IO情况下,等待文件IO的读写完成
2.阻塞式IO情况下,等待网络连接请求完成,等待网络读写完成。
3.自旋锁的自旋
4.编程人员人为构造同步假象的同步方法
针对第1,2,3种情况下,还是很容易理解的,都是底层支持的。那么针对第4种情况,我们是如何理解呢?
以前遇到过一种情况,对接自家公司其他开发人员编写的HTTP接口,人家提供的只是提交任务和查询任务2个接口,我们只能采用持续不断的测试来看任务是否完成,来模拟同步情况,如下面代码所示
int sleepTime = 1;
while(!isFinish()){
TimeUnit.Seconds.sleep(sleepTime);
sleepTime = sleepTime * 2;
}
有时候,我们的同步方法虽然是同步的,但是我们想转换成异步的,以此来让多个类似的同步方法一并执行,那么就可以借助线程池,来投递任务,这样,就转换成异步的方式了。