CyclicBarrier

一、CyclicBarrier作用
    它允許一組線程互相等待,直到到達某個公共屏障點。在設計一組固定大小的線程的程序中,這些線程必須不時地相互等待,這時CyclicBarrier很有用。因爲該Barrier在釋放線程後可以重用,所以稱它爲循環(Cyclic)的屏障(Barrier)。
二、CyclicBarrier內部實現
    CyclicBarrier的內部是使用重入鎖ReentrantLock和Condition。
    1.構造方法CyclicBarrier(int parties)它將在給定數量的線程處於等待狀態時啓動,但它不會在啓動barrier時執行預定義的操作
    2.CyclicBarrier(int parties,Runnable BarrierAction)它將在給定數量的線程處於等待狀態時啓動,並在啓動barrier時執行給定的屏障操作,該操作由最後一個進入barrier的線程執行。
三、await
    讓所有線程在barrier調用await方法之前一直等待。內部調用了dowait方法,返回值爲剩餘等待線程的數量
    await() 不超時等待
    await(long timeout,TimeUnit unit)內部調用dowait(boolean timed,long nanos方法
四、如果該線程不是最後一個到達的線程,會一直處於等待狀態除非一下情況
    1.最後一個線程到達,即index==0
    2.超出了等待時間
    3.其他線程終止了當前線程
    4.其他的某個線程中斷另一個等待的線程
    5.其他的某個線程在等待barrier超時
    6.其他的某個線程在barrier調用reset方法
五、什麼時候拋出BorkenBarrierException異常
    1.如果一個線程處於等待狀態時,如果其他線程調用reset方法。
    2.調用的barrier原本就是被破壞的,則拋出brokenBarrierException
    3.任何線程在等待時被中斷了,則其他所有線程都將拋出BrokenBarrierException異常,並將Barrier置於損壞狀態
六、Generation
    Generarion是CyclicBarrier靜態內部類,描述了CyclicBarrier的更新,在CyclicBarrier中,同一批線程屬於同一代。當有parties個線程全部達到barrier時,generation就會被更新換代。其中broken屬性,表示CyclicBarrier是否處於中斷狀態
七、BreakBarrier
    當barrier損壞了,或者有一個線程中斷了,則通過breakBarrier方法來終止所有的線程。
    代碼中將broken標誌設爲true,並調用signalAll方法,將在CyclicBarrier中處於等待狀態的線程全部喚醒
八、nextGeneration
    當index等於0時,會調用nextGeneration方法,進行更新操作
        1.喚醒所有線程
        2.重置count
        3.重置generation
九、reset
    reset方法,充值barrier到初始化的狀態
        通過調用breakbarrier和nextGeneration來實現
十、getNumberWait
    用於獲取等待的線程數
十一、isBreak
    用於判斷CyclicBarrier是否處於中斷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章