异步和同步不必说,一个需要等待结果,一个不需要等待结果
常见的异步的创建方式有.调用方创建一个子线程,在子线程中执行方法
方法实现的时候,创建一个新的线程执行主要逻辑,主线程直接return,称为异步方法
那么对于某些方法需要等待异步执行完成的方法结果,这就是异步转同步的主要需求
在调异步调用后阻塞线程,在异步完成并返回结果后,唤醒线程,继续执行,就是通知等待机制的加强版
// 创建锁与条件变量
private final Lock lock
= new ReentrantLock();
private final Condition done
= lock.newCondition();
// 调用方通过该方法等待结果
Object get(int timeout) {
long start = System.nanoTime();
lock.lock();
try {
while (!isDone()) {
done.await(timeout);
long cur = System.nanoTime();
if (isDone() ||
cur – start > timeout) {
break;
}
}
} finally {
lock.unlock();
}
if (!isDone()) {
throw new TimeoutException();
}
return returnFromResponse();
}
// RPC结果是否已经返回
boolean isDone() {
return response != null;
}
// RPC结果返回时调用该方法
private void doReceived(Response res) {
lock.lock();
try {
response = res;
if (done != null) {
done.signal();
}
} finally {
lock.unlock();
}
}
整体的思路来说,就是通过上锁,在上锁的同时尝试调用获取,如果超时或者得到返回,进行解锁操作,最后在final之中进行解锁的操作
在返回时候调用了doReceived(),在其中唤醒了线程锁,让主线程继续走下去
最近来说,异步转同步的情况越来越多了,需要更加注重这方面
例如,对于一个云主机的常见,在创建云主机的时候,本身就是异步,只是发起了一个创建的请求
但是并不得知是否已经创建成功了,这就需要利用另一个API去轮询云主机的状态