zoukankan      html  css  js  c++  java
  • 【Java并发核心三】CountDownLatch、CyclicBarrier及Phaser

    个人感觉,看书学习还是需要“不求甚解”,因为一旦太过于计较小的得失,就容易钻牛角尖,学习进度也慢。我们完全可以先学一个大概,等到真正用到的时候再把那些细节丰富起来,就更有针对性。

    所以,针对java并发核心的东西,我感觉就是一些api的调用,不需要面面俱到,只要知道每个类实现什么,如何调用就行。

    1、CountDownLatch:  java.util.concurrent.CountDownLatch  

      CountDownLatch作用:同步功能的辅助类,初始化时传入一个int类型的count值,当count计数不为0时,则当前线程呈wait状态,如果为0,则继续执行。

      需要使用await()和countDown()方法进行:

        调用await()方法,判断count 是否为0,如果不为0则等待(一直等到count值为0时,继续往下执行);await 还有一个api:await(long timeout,TimeUnit unit)。

        调用countDown()方法将count计数减1,当count减到0时,线程继续运行。可使用getCount()方法获取count值。

      对应需要同步的几个线程,需要同时使用同一个CountDownLatch实例对象

      对应countDown()方法的理解就是,相当于一辆长途汽车,只有人坐满了,才会出发(所有线程报团一起继续执行)。

      在某些情况下,涉及到多个模块同步问题时,可以使用多个CountDownLatch实例实现。

    2、CyclicBarrier:  java.util.concurrent.CyclicBarrier

      CyclicBarrier作用:与Semaphore、CountDownLatch一样,为同步辅助类。

      CountDownLatch 与 CyclicBarrier 对比:

        CountDownLatch:一个线程活多个线程,等待另外一个线程或者多个线程完成某个事情之后才继续执行。

        CyclicBarrier:多个线程之间互相等待,任何一个线程完成之前,所有线程都必须等待。CyclicBarrier计数是加法操作,加到设定值后,重新归为0,再次循环;CountDownLatch是减法操作,不会循环。

      CyclicBarrier cbRef = new CyclicBarrier( 3 , new Runnable(){/* 线程开始继续执行时操作,如打日志等 */...} );

      就上面这个CyclicBarrier对象,当调用 await() 方法,则count计数加1,当count等于3时,程序继续向下执行,否则程序将呈阻塞状态。

      常用方法:

        await()    每凑齐指定个数线程就报团继续执行

        getParties()    查看报团人数规则

        getNumberWaiting()    查看已有多少线程在等待

        reset()    重置

    3、Phaser:java.util.concurrent.Phaser

      Phaser:是对CountDownLatch 与 CyclicBarrier 的全面升级,是一个java并发api的一个重量级类。

      常用api:

        arriveAndAwaitAdvance()    每凑齐指定人数就报团执行一次,同一个线程可以执行多次arriveAndAwaitAdvance(),表示不同阶段的报团

        arriveAndDeregister()    退出当前团,且当前团规则人数减1(报完当前团后,不再报下阶段的团)

        getArrivedParties()    当前团凑足了多少人

        getRegisteredParties()    获取注册的团规定人数

        arrive()    使getArrivedParties()数量加1,即用一个虚拟线程占据一个线程的位置, 此虚拟线程不阻塞

        register()    动态增加一个团的规定人数

        bulkRegister(int parties)    动态的增加规定报团人数,是register()的多次调用版

        forceTermination()    取消报团,线程执行各自代码,不再有Phaser阻塞等待情况    

        getUnarrivedParties()    当前还差多少线程开团,是getArrivedParties()方法的补集

        isTerminated()    判断Phaser对象是否已为销毁状态

        ...

  • 相关阅读:
    延时函数出错,volatile一例
    【转】STM32中的抢占优先级、响应优先级概念
    【转载】串口中怎样接收一个完整数据包的解析
    ARM-ContexM3/4组优先级和子优先级抢占规则
    【转载】Keil中的USE MicroLib说明
    线程让出实验【RT-Thread学习笔记 4】
    线程优先级抢占实验【RT-Thread学习笔记 3】
    RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】
    熟悉RT-Thread的软硬件环境【RT-Thread学习笔记 1】
    RT-Thread下的串口驱动程序分析【转载】
  • 原文地址:https://www.cnblogs.com/klbc/p/9715779.html
Copyright © 2011-2022 走看看