异步和同步不必说,一个需要等待结果,一个不需要等待结果

常见的异步的创建方式有.调用方创建一个子线程,在子线程中执行方法

方法实现的时候,创建一个新的线程执行主要逻辑,主线程直接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去轮询云主机的状态

发表评论

邮箱地址不会被公开。 必填项已用*标注