上節(jié)介紹了多線程之間競爭訪問同一個資源的問題及解決方案synchronized,我們提到,多線程之間除了競爭,還經(jīng)常需要相互協(xié)作,本節(jié)就來介紹Java中多線程協(xié)作的基本機制wait/notify。
都有哪些場景需要協(xié)作?wait/notify是什么?如何使用?實現(xiàn)原理是什么?協(xié)作的核心是什么?如何實現(xiàn)各種典型的協(xié)作場景?由于內(nèi)容較多,我們分為上下兩節(jié)來介紹。
我們先來看看都有哪些協(xié)作的場景。
協(xié)作的場景
多線程之間需要協(xié)作的場景有很多,比如說:
生產(chǎn)者/消費者協(xié)作模式:這是一種常見的協(xié)作模式,生產(chǎn)者線程和消費者線程通過共享隊列進行協(xié)作,生產(chǎn)者將數(shù)據(jù)或任務放到隊列上,而消費者從隊列上取數(shù)據(jù)或任務,如果隊列長度有限,在隊列滿的時候,生產(chǎn)者需要等待,而在隊列為空的時候,消費者需要等待。
同時開始:類似運動員比賽,在聽到比賽開始槍響后同時開始,在一些程序,尤其是模擬仿真程序中,要求多個線程能同時開始。
等待結(jié)束:主從協(xié)作模式也是一種常見的協(xié)作模式,主線程將任務分解為若干個子任務,為每個子任務創(chuàng)建一個線程,主線程在繼續(xù)執(zhí)行其他任務之前需要等待每個子任務執(zhí)行完畢。
異步結(jié)果:在主從協(xié)作模式中,主線程手工創(chuàng)建子線程的寫法往往比較麻煩,一種常見的模式是將子線程的管理封裝為異步調(diào)用,異步調(diào)用馬上返回,但返回的不是最終的結(jié)果,而是一個一般稱為Promise或Future的對象,通過它可以在隨后獲得最終的結(jié)果。
集合點:類似于學?;蚬窘M團旅游,在旅游過程中有若干集合點,比如出發(fā)集合點,每個人從不同地方來到集合點,所有人到齊后進行下一項活動,在一些程序,比如并行迭代計算中,每個線程負責一部分計算,然后在集合點等待其他線程完成,所有線程到齊后,交換數(shù)據(jù)和計