四個人相約出去上網,你告訴司機,等四個都上車了,您在開。所以每個人上車的時候,都會告訴司機,你來了。司機就會記錄下來,當來的人夠四個的時候,自己才能開車去往目的地。
它常用的兩個方法
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是同步基元,它只向乙個執行緒授予對共享資源的獨佔訪問權。如果乙個執行緒獲取了互斥體,則要獲取該互斥體的第二個執行緒將被掛起,直到第乙個執行緒釋放該互...