一、问题
应用场景
二、分析
三、实现方法
1.轮询与休眠重试机制
2.wait/notify
3.Lock Condition
4.CountDownLatch
5.CyclicBarrier
6.LockSupport
一、问题
应用场景
如何实现异步转同步?
二、分析
首先,解释下同步和异步
同步,就是发出一个调用时,在没有得到结果之前,该调用就不返回或不继续执行后续操作。
异步,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。
当这个调用完成后,一般通过状态、通知和回调来通知调用者。
对于异步调用,调用的返回并不受调用者控制。
异步转同步主要实现思路:
所有实现原理类似,是在发出调用的线程中进行阻塞等待结果,调用完成后通过回调、
设置共享状态或通知进行阻塞状态的解除,继续执行后续操作。
三、实现方法
通常,实现中,不会无限的等待,一般会设定一个超时时间,具体超时时间根据具体场景确定。
下面以回调的方式介绍几种常用实现异步转同步的方法:
1.轮询与休眠 重试机制
采用轮询与休眠重试机制,线程将反复在休眠和测试状态条件中之间切换,直到超时或者状态条件满足继续向下执行。
这种方式,超时时间控制不准确,sleep时间需要在响应性和CPU使用率之间进行权衡。
private static long MILLIS_OF_WAIT_TIME = 300000L;// 等待时间 5分钟
private final Object lock = new Object();
//3.结果返回后进行回调,解除阻塞
@Override
public void callback(AsynResponse response){
synchronized(lock){
//设置状态条件
}
public Result getResult() throws ErrorCodeException {
// 1.异步调用
// 2.阻塞等待异步响应
long future