JUC包下的常用多執行緒輔助類

2021-10-01 22:32:58 字數 1830 閱讀 5321

允許乙個或多個執行緒等待直到在其他執行緒中執行的一組操作完成的同步輔助。

countdownlatch用給定的計數初始化。

await方法阻塞,直到由於呼叫countdown()方法,當前計數達到零,此後所有等待執行緒被釋放,並且任何後續的呼叫await立即返回。

這是乙個一次性的現象 - 計數無法重置。

場景舉例:等所有人離開房間後才關門

public

static

void

main

(string[

] args)

throws exception

,"第"

+ i +

"個人").

start()

;}countdownlatch.

await()

;// 計數器減到0之前,主線程在此位置阻塞;

system.out.

println

("鎖門!");

}

允許一組執行緒全部等待彼此達到共同屏障點的同步輔助。 迴圈阻塞在涉及固定大小的執行緒方的程式中很有用,這些執行緒必須偶爾等待彼此。

屏障被稱為迴圈,因為它可以在等待的執行緒被釋放之後重新使用。

cyclicbarrier支援乙個可選的runnable命令,每個屏障點執行一次,在派對中的最後乙個執行緒到達之後,但在任何執行緒釋放之前。

在任何一方繼續進行之前,此屏障操作對更新共享狀態很有用。

場景舉例:集齊七龍珠召喚神龍

public

class

test

catch

(exception e)})

.start()

;}}}

乙個計數訊號量。 在概念上,訊號量維持一組許可證。 如果有必要,每個acquire()阻止許可證可用,然後取出。

每個release()都新增了乙個許可證,潛在地釋放乙個阻塞獲取方。 但是,沒有使用實際的許可證物件;

semaphore只保留可用數量的計數,並相應地進行操作。 訊號量通常用於限制執行緒數,而不是訪問某些(物理或邏輯)資源。

總結來說就是 在訊號量上定義了兩個操作

訊號量主要有兩個目的,一是用於多個共享資源的互斥作用,另乙個是併發執行緒數的控制(高併發限流???)。

場景舉例:七輛汽車搶4個車位,搶不到則等待,有車位空出來繼續開搶(不排隊)

public

class

test

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"搶到了車位");

trycatch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+"離開了車位");

semaphore.

release()

;}).

start()

;}}}

思考:當訊號量為1時的情況相當於加了synchronize鎖的資源,同一時間只能有乙個執行緒訪問。

持續更新。。。

多執行緒(九)JUC包下的類

countdownlatch類位於j a.util.concurrent 包下,利用它可以實現類似計數器的功能。比如有乙個任務 a,它要等待其他 4 個任務執行完畢之後才能執行,此時就可以利用 countdownlatch來實現這種功能了。public static void main string...

JUC 常用輔助類

public class countdemo string.valueof i start cd.await system.out.println thread.currentthread getname t班長離開教室 countdownlatch在初始化時傳入乙個數值,通過cd.countdow...

JUC 7 常用輔助類

減法計數器 public class countdownlatchdemo string.valueof i start countdownlatch.await 等待計數器歸零,然後再向下執行 system.out.println close door 原理 countdownlatch.coun...