JAVA高并发之COUNTDOWNLATCH,CYCLICBARRIER和JOIN

  一、CountDownLatch:

  功能:同步辅助类,也可以理解为倒计时锁,用于同步线程状态,允许一个或多个线程,等待其他一组线程完成操作,再继续往下执行。

  特点:不可复用!

  重要方法:countDown()方法:计数器-1,每次线程执行完后调用;await()方法:等待方法,在需要阻塞的地方调用,当所有线程都执行完后,自动往下执行

  用法:构造的时候指定一个计数器的值,每个线程执行完后就减1,直到为0再往下走。如下:

  输出结果:

  可以看到:2个子线程分别睡眠了3s和5s,而主线的打印的“所有现场执行完毕”却是在所有子线程执行完成后才输出的,原因就是阻塞在了latch.await()方法,这个方法会等到所有线程都执行完才往下执行,阻塞的原理后面有空再研究分析

  二、CyclicBarrier(循环栅栏):

  功能:同步辅助类,功能和CountDownLatch类似,用于同步线程状态,允许一组线程相互之间等待,达到一个共同点,再继续执行。

  特点:可复用!当组内所有线程都到达某个执行点后,parties参数会被重置,于是就可重用了。

  重要方法:await()方法:当某个线程到达某个点(比如执行完某个任务)后调用该方法,就会等待其他线程,直到所有线程都到达这个点,再自动往下执行。还有个重载方法await(long timeOut,TimeUnit unit),用于当某个线程执行超过指定时间后还未到达某个点时,就会抛出异常,不再等待这个线程,并往下执行。

  用法:构造的时候指定一个线程数量的值和到达某个点后执行的动作,如下:

  执行结果如下:

  可以看到:当前线程先于2个子线程打印执行结果,原因就是CyclicBarrier针对的是一组线程之间的等待,await方法会等待该组内所有线程都执行完毕再往下执行,Runnable接口里定义的动作是在所有线程执行完毕后,随机选择一个线程来执行

  三、join()方法:

  join方法也是管理线程状态同步的一个方法,和CountDownLatch和CyclicBarrier均由自身调用不同的是,join的调用者为当前线程,后面的线程必须等调用join的线程执行完后才能执行。参考例子如下:

  执行结果:

  结果分析:新创建了2个线程,每个线程的执行功能和时间是一样的,由于调用了join,主线程确实是在调用join的2个线程执行后才开始执行的

  3者区别:

  1、CountDownLatch不可复用,当计数器减为0后,只能重新构造新的计数器,CyclicBarrier可以复用,原因上面已说。

  2、CyclicBarrier针对的是一组线程之间的等待,是组内等待关系,CountDownLatch针对的是一个线程等待别的一组线程的关系,是组间等待关系。

  3、join方法和CountDownLatch方法功能类似,但是join方法不如CountdownLatch控制灵活,可以参考:https://blog.csdn.net/zhutulang/article/details/48504487。

郑州哪个妇科医院好:http://www.tongjink.com/郑州看妇科哪家好:http://www.tongjink.com/郑州妇科医院:http://www.tongjink.com/郑州治疗妇科费用:http://www.tongjink.com/郑州哪里看妇科好:http://www.tongjink.com/郑州妇科医院:http://jbk.39.net/yiyuanzaixian/sysdfkyy/

猜你喜欢

转载自blog.csdn.net/qq_42564846/article/details/80996934