上節(jié)介紹了多線程之間競(jìng)爭(zhēng)訪問(wèn)同一個(gè)資源的問(wèn)題及解決方案synchronized,我們提到,多線程之間除了競(jìng)爭(zhēng),還經(jīng)常需要相互協(xié)作,本節(jié)就來(lái)介紹Java中多線程協(xié)作的基本機(jī)制wait/notify。

都有哪些場(chǎng)景需要協(xié)作?wait/notify是什么?如何使用?實(shí)現(xiàn)原理是什么?協(xié)作的核心是什么?如何實(shí)現(xiàn)各種典型的協(xié)作場(chǎng)景?由于內(nèi)容較多,我們分為上下兩節(jié)來(lái)介紹。

我們先來(lái)看看都有哪些協(xié)作的場(chǎng)景。

協(xié)作的場(chǎng)景

多線程之間需要協(xié)作的場(chǎng)景有很多,比如說(shuō):

  • 生產(chǎn)者/消費(fèi)者協(xié)作模式:這是一種常見(jiàn)的協(xié)作模式,生產(chǎn)者線程和消費(fèi)者線程通過(guò)共享隊(duì)列進(jìn)行協(xié)作,生產(chǎn)者將數(shù)據(jù)或任務(wù)放到隊(duì)列上,而消費(fèi)者從隊(duì)列上取數(shù)據(jù)或任務(wù),如果隊(duì)列長(zhǎng)度有限,在隊(duì)列滿的時(shí)候,生產(chǎn)者需要等待,而在隊(duì)列為空的時(shí)候,消費(fèi)者需要等待。

  • 同時(shí)開(kāi)始:類似運(yùn)動(dòng)員比賽,在聽(tīng)到比賽開(kāi)始槍響后同時(shí)開(kāi)始,在一些程序,尤其是模擬仿真程序中,要求多個(gè)線程能同時(shí)開(kāi)始。

  • 等待結(jié)束:主從協(xié)作模式也是一種常見(jiàn)的協(xié)作模式,主線程將任務(wù)分解為若干個(gè)子任務(wù),為每個(gè)子任務(wù)創(chuàng)建一個(gè)線程,主線程在繼續(xù)執(zhí)行其他任務(wù)之前需要等待每個(gè)子任務(wù)執(zhí)行完畢。

  • 異步結(jié)果:在主從協(xié)作模式中,主線程手工創(chuàng)建子線程的寫(xiě)法往往比較麻煩,一種常見(jiàn)的模式是將子線程的管理封裝為異步調(diào)用,異步調(diào)用馬上返回,但返回的不是最終的結(jié)果,而是一個(gè)一般稱為Promise或Future的對(duì)象,通過(guò)它可以在隨后獲得最終的結(jié)果。

  • 集合點(diǎn):類似于學(xué)?;蚬窘M團(tuán)旅游,在旅游過(guò)程中有若干集合點(diǎn),比如出發(fā)集合點(diǎn),每個(gè)人從不同地方來(lái)到集合點(diǎn),所有人到齊后進(jìn)行下一項(xiàng)活動(dòng),在一些程序,比如并行迭代計(jì)算中,每個(gè)線程負(fù)責(zé)一部分計(jì)算,然后在集合點(diǎn)等待其他線程完成,所有線程到齊后,交換數(shù)據(jù)和計(jì)

    網(wǎng)友評(píng)論