java多線程併發(四)(線程協作)

轉自:http://blog.psjay.com/posts/summary-of-java-concurrency-four-collaboration/

很多時候,一個線程並不能獨自完成一個完整的任務,線程之間進行協作是很常見的。在協作的時候,一個線程可能需要等待一個條件爲真時才能(再次)開始工作。這個時候,使用while進行忙等待是可以實現功能的,但是其效率存在着很大的問題:畢竟CPU時間片讓這些忙等待白白浪費了。這個時候,就需要用到Object的wait(),notify()和notifyAll()這幾個方法:

wait():當前線程被掛起,暫時停止繼續執行,釋放所持有的鎖

notify():喚醒當前鎖對象的等待隊列中的一個線程,如果條件滿足,這個線程將會得到執行。

notifyAll():喚醒當前鎖對象的等待隊列中的所有線程,最終只有一個線程會得到執行。

Object lock = new Object();
		synchronized(lock) {
		      while(條件不滿足) {
		           lock.wait();
		      }
		//正常的業務邏輯
		}


值得提醒的是,這三個方法必須在同步方法或者同步塊中,因爲執行的前提就是當前線程持有鎖。如果違反了這條規則,將會拋出一個IllegalMonitorStateException異常。

類比

有一個很合適的生活中得例子可以用來類比這種線程間得協作方法。

比如有老胡,老溫,老習要到圖書館借同一本書:《老毛在想什麼》。而恰恰圖書館只有一本這樣的書了。於是被先到的老胡給借到了。於是等老溫和老習來借的時候,他們兩老就會碰壁。現在他們有兩種做法:1.每天來圖書館問老胡有沒有把書給還掉(忙等待)。2.在家等圖書館發出老胡已經把書還掉的通知。顯然,第二種做法優於第一種做法。而圖書館發通知也有兩種做法:1.只通知老溫和老習中的一個人(notify())。2.同時通知老溫和老習,誰先到誰就先借(notifyAll())。


發佈了33 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章