多线程设计模式-同步方法和异步方法的相互转化

同步方法方便程序员使用和理解,因为方法的返回时机是在方法完成之后,能够得到明确的结果。

异步方法却不是太好理解,因为方法一调用,就立马返回得到一个方法调用存根,比如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;   
}

有时候,我们的同步方法虽然是同步的,但是我们想转换成异步的,以此来让多个类似的同步方法一并执行,那么就可以借助线程池,来投递任务,这样,就转换成异步的方式了。

猜你喜欢

转载自www.cnblogs.com/weiguangyue/p/12297059.html