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

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

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

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

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

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

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


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

举个例子:

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


异步结果同步的方法: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来做结果的同步。


你可能感兴趣的:(Java)