详解Java中异步转同步的六种方法

一、问题

         应用场景

二、分析

三、实现方法

   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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值