同步和异步、阻塞和非阻塞区别

同步/异步消息通信机制,也就是调用者如何获取结果的方式来讲的---

    同步:调用者调用方法之后不返回,直到得到结果后返回;

    异步:调用者调用方法之后不管结果,直接返回,结果是被调用者通过状态或者通知或者回调函数来告诉调用者;

阻塞/非阻塞是对等待调用结果这段时间线程的状态来讲的---

    阻塞:调用结果返回之前,当前线程被挂起;

    非阻塞:调用结果返回之前,当前线程不被挂起,正常继续执行;


同步/异步 和 阻塞/非阻塞 之间无关。

举个例子:

异步阻塞:调用一个下载函数(会开启一个下载线程,在下载线程里去下载),然后直接返回,之后当前线程挂起,直到该下载有了结果通过回调告诉当前线程成功了还是失败了,并且唤醒当前线程继续运行;


异步结果同步的方法:synchronize和CountDownLatch

1、通过synchronize( waitObject ){ waitObject.wait();}挂起当前线程,因为当前线程已经挂起,所以如果要唤醒当前线程,需要另外一个线程来唤醒它,可用synchronize(waitObject){waitObject.notifyAll( )或者是waitObject.notify( );}。---通常是用于简单的一个层级的结果同步;当然也可用于嵌套模式的结果同步,也就是逐级唤醒线程;

2、通过CountDownLatch来做,在需要挂起线程的地方通过 latch.await( )的方法(latch的计数如果大于0,则线程会被挂起,否则不会),在其他线程回调返回结果的地方用latch.countDown( )来释放线程,当latch的初始值为大于1时,latch需要等所有的结果返回后被countDown( ) 为0后挂起的线程才会继续执行。---通常是用于有多个结果需要同步才唤醒线程的场景;比如,一次发起多个文件下载,多个文件下载有了结果之后才能继续后续处理,此时就可以用latch来做结果的同步。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值