人與人之間通過交流構成了這個豐富多彩的世界,在計算機中,通過即時通信工具傳遞信息為我么的生活增添了很多樂趣也提供了很多遍歷,而在JAVA線程的世界里,線程之間的通信,可以極大的增強我們的功能,今天就帶你一塊走進線程通信的世界里。
這篇文章是基礎入門文章,主要是wait和notify來解決單線程通信問題的。對于多線程通信極其實現方式我會在后續的課程中依次推出。不喜勿噴。
一、基本認識
在講解java線程之間的問題時,我們先想一下,為什么需要線程之間的通信呢?我們舉一個例子:
愚公門前有座大山,想要移走,可是評價自己的力量肯定不夠呀,于是叫來了一伙人,一塊把這座山移走。
以上這個簡單的案例就能夠表達我們的意思,也就是需要合作辦成某件事。在java中,我們想要完成某個功能,一個線程完成不了,這時候就需要兩個或者是多個線程一塊來完成了,多個線程一塊合作這時候就需要交流,也就是通信了。
通信的方式很多,比如說共享內存、管道、mutex等等各種方式,不管是那種方式都是為了完成功能而已。
另外還有一個需要注意的問題,那就是什么是進程間通信?我們同樣舉一個例子。
有兩個國家,國家內部之間的交流就是線程間通信,兩個國家之間的交流就是進程間通信。
下面我們就來看看如何進行通信。
二、單線程間通信實現
java解決單線程之間的通信很簡單,大致上有三種,我們依次來分析實現一下。這里要完成一個功能,那就是生產者和消費者模型。假設我們想要完成的功能描述如下:
工廠生產完了東西之后,通知消費者消費,在生產出來之前,消費者等待。我們直接看實現方法。
上面的這個生產消費過程看起來完全沒毛病,我們就寫一下main方法中測試一下:
也就是說我們開啟兩個線程,一個用于生產,一個用于消費,沒毛病吧。那我們就運行一下,看看結果。
我們一下子把所有的全部生產出來了,但是消費的時候消費了最后一個而且還是重復消費的。這就有問題了,我們明明想要的就是生產一個消費一個,這時候怎么辦呢?這就用到了我們的等待通知模型。
現在我們再來測試一下:
我們再看一下測試結果吧。
以上就是單線程之間通信最簡單的解決方法。當然了單線程的通信肯定是不能滿足我們的日常需求的。而且對于上述問題我們還有很多其他的方式可以解決。這篇文章只是起到一個拋磚引玉的作用。