併發程式設計中 執行緒協調工作的類

2021-10-05 07:08:33 字數 3042 閱讀 5873

四個人相約出去上網,你告訴司機,等四個都上車了,您在開。所以每個人上車的時候,都會告訴司機,你來了。司機就會記錄下來,當來的人夠四個的時候,自己才能開車去往目的地。

它常用的兩個方法

countdown()

// 給司機報到的方法

await()

// 示意開車的方法 (就是四個都到了,才執行 此方法後邊的**,否則執行緒都阻塞)

countdownlatch 的使用方法與上邊的思想比較類似,就是它初始化的時候會指定乙個數值,當執行緒執行滿意之後,就可以呼喚countdown()它一次,當呼喚到達指定次數之後,就會執行await()後的方法

demo

@test

public

void

countdownlatchtest()

throws interruptedexception

,"執行緒"

+ number)

.start()

;});

countdownlatch.

await()

; system.out.

println

("開車了");

}

輸出結果

但是,它有個不足,就只能使用一次,如果下次想再次使用,需要重新定義乙個門閂,所以引出了下乙個可以復用的cyclicbarrier

它的思想和countdownlatch 類似,只不過它可以重複使用

demo

@test

public

void

cyclicbarriertest()

throws interruptedexception

catch

(interruptedexception e)

newthread((

)->

catch

(interruptedexception

| brokenbarrierexception e)

},n.

tostring()

).start()

;});

// 睡一下,防止程式執行太快看不到結果

timeunit.seconds.

sleep(10);}

輸出結果

exchanger 的機制:就是兩個執行緒需要交換資訊,我給了你資訊,你再給我資訊,咱倆才能往下走;我給了你,你不給我,我就一直阻塞著(如下圖)。

;// 讓主線程睡一會,不然程式直接結束了,看不到效果

thread.

sleep

(5000);

}輸出結果

上邊描述的兩個人交換的情況,但是三個人的怎麼個情況呢?

它會定義乙個資源的數量,當執行緒申請資源的時候,數量就會減少,當數量減少為0 的時候,其他執行緒再申請資源的時候,就需要等待別的執行緒把資源釋放的時候,等待的執行緒才能獲取資源。

這個過程和進停車廠停車特別類似,有空閒車位,保安會讓你進;但是沒有空閒車位,你只能等其他人出來之後,你在進去了。

demo

@test

public

void

semaphoretest()

catch

(interruptedexception e)

// 隨機生成資源占用的時間

int parkingtime = random.

nextint(10

)+2;

trycatch

(interruptedexception e)

// 釋放資源

semaphore.

release()

; system.out.

println

("釋放資源"

+ thread.

currentthread()

.getname()

);},

"執行緒"

+ n)

.start()

;});

// 讓主線程睡一會,不然程式直接結束了,看不到效果

trycatch

(interruptedexception e)

}

輸出結果

簡做總結,如有不足,歡迎指出。

工作中線程的使用

1.handle createthread lpsecurity attributes lpthreadattributes,sd size t dwstacksize,initial stack size lpthread start routine lpstartaddress,thread f...

集合中線程安全的類

集合中線程安全的類有 vector,stack,hashtable,enumeration,除此之外均是非執行緒安全的類與介面 collection是物件集合,collection有兩個子介面 list 和 set,list 可以通過下標 1,2.來取得值,值可以重複,而 set 只能通過游標來取值...

C 中線程類的使用經驗

一.mutex類 msdn簡單描述 當兩個或更多執行緒需要同時訪問乙個共享資源時,系 統需要使用同步機制來確保 一次只有乙個執行緒使用該資源。mutex是同步基元,它只向乙個執行緒授予對共享資源的獨佔訪問權。如果乙個執行緒獲取了互斥體,則要獲取該互斥體的第二個執行緒將被掛起,直到第乙個執行緒釋放該互...