[099]技術(shù)-jdk中的多線程相關(guān)的基本數(shù)據(jù)結(jié)構(gòu)

CountdownLatch

countdownLatch為多個(gè)線程整體到達(dá)條件時(shí)通知await的線程,即時(shí)序圖如下:


image.png

由圖中我們知道魏割,執(zhí)行的.countDown()方法的線程不會(huì)阻塞會(huì)接著干自己的事情庭呜,當(dāng)thread1,2,3這3個(gè)線程都已經(jīng)執(zhí)行了countdown的時(shí)候就會(huì)通知 countdownLatch.await()上等待的線程滑进。 其具體表現(xiàn)是一撥人等另一撥人。

具體偽代碼交互模式為:

main(){
  CountdownLatch countDownLatch = new CountDownLatch(5);  //主線程
  //countdown操作
  new Thread( new Runnable(){ public void run(){ countDownLatch .countdown() }}).start();
  new Thread( new Runnable(){ public void run(){ countDownLatch .countdown() }}).start();
 
 //await操作募谎,等待countdownLatch變成0扶关,才繼續(xù)執(zhí)行
  new Thread( new Runnable(){ public void run(){ countDownLatch .await() }}).start();
}

相關(guān)countlatchdown代碼可以參考:https://blog.csdn.net/simonchi/article/details/47150173

CyclicBarrier

image.png

由圖我們知道,所有調(diào)用了CyclicBarrier.await()的線程會(huì)被阻塞数冬,知道所有在Cyclic上的線程都await了后會(huì)整體釋放一起恢復(fù)執(zhí)行节槐。其具體表現(xiàn)是等一撥人籌齊了再走。

其交互偽代碼為:

CyclicBarrier cb = new CyclicBarrier(3)
  new Thread( new Runnable(){ public void run(){ cb.await() }}).start();
  new Thread( new Runnable(){ public void run(){ cb.await()}}).start();
  //如果沒(méi)有第三個(gè)線程執(zhí)行cb.await()的話拐纱,那么 第一第二個(gè)線程永遠(yuǎn)在等待(除非被interrupted)

Exchanger

Exchange用于另個(gè)線程之間交換數(shù)據(jù)铜异,如果一個(gè)線程thread1執(zhí)行了Exchanger.exchange()方法另一個(gè)線程thread2還沒(méi)有,那么thread1會(huì)被阻塞戳玫。其交互圖如下:


image.png

Exchanger經(jīng)常用于兩個(gè)線程交換隊(duì)列數(shù)據(jù)熙掺。

Final Exchanger<List<Integer>> exchanger = new Exchanger<List<Integer>>();
//兩個(gè)線程交換隊(duì)列
thread1 = new Thread
{
    new  Runnabler(){
       .......
        list1 =new Arraylist<String>();
        list1 = exchanger.exchanger(list1)
   }
}.start()

thread2 = new Thread
{
    new  Runnabler(){
       .......
        list2 =new Arraylist<String>();
        list2 = exchanger.exchanger(list2)
   }
}.start()

Semaphore

信號(hào)量用于控制線程之間的并發(fā),比如5臺(tái)機(jī)器8個(gè)工人操作每臺(tái)機(jī)器只能被一個(gè)工人操作咕宿。那么可以通過(guò)semaphore來(lái)操作币绩。

main(){
Semaphore semaphore = new Semaphore(5);
  new Runnable()
 {
   semaphore.acquire();//如果沒(méi)有獲取到線程阻塞
   .......do job....
  semaphore.release();
 }
}
//注意 semaphore.acquire()沒(méi)有獲取的話阻塞,如果不想阻塞可以替換成semaphore.tryacquire();//如果獲取成功返回true府阀,沒(méi)有獲取成功返回false

wait, notify,notifyAll

查看jdk Object.java 查看了釋義缆镣,七對(duì)wait和notify解釋如下:
wait:cause the current thread to wait until another thread to invoke the notify/notifyall method of this object.
1.首先什么是current thread即當(dāng)前正在執(zhí)行queue.wait()的線程 currentThread1。
2.我們需要通過(guò)另外一個(gè)線程 調(diào)用 queue.notify()來(lái)喚醒在 queue對(duì)象上等待的線程(有個(gè)等待隊(duì)列)试浙。

寫(xiě)代碼需要注意以下幾點(diǎn):
1.wait和notify用于線程間協(xié)同董瞻,它是一個(gè)線程共享對(duì)象,所以需要加鎖或者其他機(jī)制保證線程間可見(jiàn)和同步田巴。
2.在調(diào)用wait的時(shí)候钠糊,要先判斷是否條件不夠。
具體以生產(chǎn)者消費(fèi)者模型:

producer:
synchronized(queue)
{
   condition = hold
   queue.notifyall();
   
    // 喚醒等待的線程(consumer線程壹哺,告訴他們有工作可以做了)去取隊(duì)列數(shù)據(jù)工作
}

consumer:
synchronized(queue)
{
 while (&lt;condition does not hold&gt;) //該consumer下次任務(wù)同樣要判斷
        queue.wait(timeout, nanos);
       // Perform action appropriate to condition  ->這個(gè)是被喚醒之后執(zhí)行的吧抄伍。
     }
   }
}

疑問(wèn):要consumer線程一直while檢查條件,那么意思是說(shuō)queue.wati()后consumer線程還會(huì)去進(jìn)行下一次循環(huán)遍歷么管宵?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末截珍,一起剝皮案震驚了整個(gè)濱河市攀甚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岗喉,老刑警劉巖秋度,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钱床,居然都是意外死亡荚斯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)诞丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鲸拥,“玉大人,你說(shuō)我怎么就攤上這事僧免。” “怎么了捏浊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵懂衩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我金踪,道長(zhǎng)浊洞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任胡岔,我火速辦了婚禮法希,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靶瘸。我一直安慰自己苫亦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布怨咪。 她就那樣靜靜地躺著屋剑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诗眨。 梳的紋絲不亂的頭發(fā)上唉匾,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音匠楚,去河邊找鬼巍膘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芋簿,可吹牛的內(nèi)容都是我干的峡懈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼益咬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逮诲!你這毒婦竟也來(lái)了帜平?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梅鹦,失蹤者是張志新(化名)和其女友劉穎裆甩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體齐唆,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗤栓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箍邮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉帅。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锭弊,靈堂內(nèi)的尸體忽然破棺而出堪澎,到底是詐尸還是另有隱情,我是刑警寧澤味滞,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布樱蛤,位于F島的核電站,受9級(jí)特大地震影響剑鞍,放射性物質(zhì)發(fā)生泄漏昨凡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一蚁署、第九天 我趴在偏房一處隱蔽的房頂上張望便脊。 院中可真熱鬧,春花似錦光戈、人聲如沸哪痰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妒御。三九已至,卻和暖如春镇饺,著一層夾襖步出監(jiān)牢的瞬間乎莉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工奸笤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惋啃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓监右,卻偏偏與公主長(zhǎng)得像边灭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子健盒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來(lái)是分開(kāi)三篇的绒瘦,后來(lái)想想還是整...
    coder_pig閱讀 1,653評(píng)論 2 17
  • **1.讀書(shū)筆記:Android開(kāi)發(fā)進(jìn)階称簿,從小工到專(zhuān)家,ThinkinJava2.參考blog3.http://w...
    石器時(shí)代小古董閱讀 554評(píng)論 0 1
  • 1.接口和類(lèi) I:ExcutorI:ExcutorServiceAC:AbstractExecutorServic...
    BangAiN閱讀 2,441評(píng)論 0 2
  • 斛兵塘畔惰帽,愜意的享受秋日憨降,一掃月來(lái)秋雨綿綿帶來(lái)的陰沉、黏稠與濕答.身體该酗、頭發(fā)授药、指尖,微微發(fā)熱呜魄,不禁一陣愉悅悔叽,此時(shí)若...
    05389adbcdef閱讀 188評(píng)論 0 1
  • 之前的博客是在其他的平臺(tái)上寫(xiě)的,其實(shí)本人也不是很喜歡寫(xiě)爵嗅,只是想起來(lái)了亦或者空閑了寫(xiě)點(diǎn)娇澎,并且因?yàn)榧夹g(shù)也不是很好,寫(xiě)的...
    滄冥海閱讀 268評(píng)論 0 0