人與人之間通過交流構(gòu)成了這個豐富多彩的世界,在計算機(jī)中,通過即時通信工具傳遞信息為我么的生活增添了很多樂趣也提供了很多遍歷,而在JAVA線程的世界里,線程之間的通信,可以極大的增強(qiáng)我們的功能,今天就帶你一塊走進(jìn)線程通信的世界里。
這篇文章是基礎(chǔ)入門文章,主要是wait和notify來解決單線程通信問題的。對于多線程通信極其實現(xiàn)方式我會在后續(xù)的課程中依次推出。不喜勿噴。
一、基本認(rèn)識
在講解java線程之間的問題時,我們先想一下,為什么需要線程之間的通信呢?我們舉一個例子:
愚公門前有座大山,想要移走,可是評價自己的力量肯定不夠呀,于是叫來了一伙人,一塊把這座山移走。

以上這個簡單的案例就能夠表達(dá)我們的意思,也就是需要合作辦成某件事。在java中,我們想要完成某個功能,一個線程完成不了,這時候就需要兩個或者是多個線程一塊來完成了,多個線程一塊合作這時候就需要交流,也就是通信了。
通信的方式很多,比如說共享內(nèi)存、管道、mutex等等各種方式,不管是那種方式都是為了完成功能而已。
另外還有一個需要注意的問題,那就是什么是進(jìn)程間通信?我們同樣舉一個例子。
有兩個國家,國家內(nèi)部之間的交流就是線程間通信,兩個國家之間的交流就是進(jìn)程間通信。

下面我們就來看看如何進(jìn)行通信。
二、單線程間通信實現(xiàn)
java解決單線程之間的通信很簡單,大致上有三種,我們依次來分析實現(xiàn)一下。這里要完成一個功能,那就是生產(chǎn)者和消費(fèi)者模型。假設(shè)我們想要完成的功能描述如下:
工廠生產(chǎn)完了東西之后,通知消費(fèi)者消費(fèi),在生產(chǎn)出來之前,消費(fèi)者等待。我們直接看實現(xiàn)方法。

上面的這個生產(chǎn)消費(fèi)過程看起來完全沒毛病,我們就寫一下main方法中測試一下:

也就是說我們開啟兩個線程,一個用于生產(chǎn),一個用于消費(fèi),沒毛病吧。那我們就運(yùn)行一下,看看結(jié)果。

我們一下子把所有的全部生產(chǎn)出來了,但是消費(fèi)的時候消費(fèi)了最后一個而且還是重復(fù)消費(fèi)的。這就有問題了,我們明明想要的就是生產(chǎn)一個消費(fèi)一個,這時候怎么辦呢?這就用到了我們的等待通知模型。

現(xiàn)在我們再來測試一下:

我們再看一下測試結(jié)果吧。

以上就是單線程之間通信最簡單的解決方法。當(dāng)然了單線程的通信肯定是不能滿足我們的日常需求的。而且對于上述問題我們還有很多其他的方式可以解決。這篇文章只是起到一個拋磚引玉的作用。