1. 程式人生 > >多執行緒---執行緒通訊

多執行緒---執行緒通訊


1.使用wait/notify方法實現執行緒之間的通訊

  • wait( ),notify( ),notifyAll( )都不屬於Thread類,而是屬於Object基礎類,也就是每個物件都有這三個方法的功能,因為每個物件都有鎖,鎖是每個物件的基礎,當然操作鎖的方法也是最基礎了。
  • 當需要呼叫以上的方法的時候,一定要對競爭資源進行加鎖,如果不加鎖的話,則會報 IllegalMonitorStateException 異常
  • 當想要呼叫wait( )進行執行緒等待時,必須要取得這個鎖物件的控制權(物件監視器),一般是放到synchronized(obj)程式碼中。
  • 當wait()方法被呼叫時,該執行緒會是發出CPU資源,由其他執行緒進行競爭。
  • 呼叫了wait函式的執行緒會一直等待,直到有其他執行緒呼叫了同一個物件的notify或者notifyAll方法才能被喚醒,需要注意的是:被喚醒並不代表立即獲得物件的鎖。也就是說,一個執行緒呼叫了物件的wait方法後,他需要等待兩件事情的發生:

             (1)有其他執行緒呼叫同一個物件的notify或者notifyAll方法(呼叫notify/notifyAll方法之前)
             (2)被喚醒之後重新獲得物件的鎖(呼叫notify/notifyAll方法之後)

  • 呼叫notify和notifyAll方法後,當前執行緒並不會立即放棄鎖的持有權,而必須要等待當前同步程式碼塊執行完才會讓出鎖(同上一條所表述的意思一樣)。
  • 如果一個執行緒呼叫了某個物件的wait方法,但是後續並沒有其他執行緒呼叫該物件的notify或者notifyAll方法,則該執行緒將會永遠等下去…

編寫測試程式碼如下:

執行結果:

2.管道通訊
管道流主要用來實現兩個執行緒之間的二進位制資料的傳播,下面以PipedInputStream類和PipedOutputStream類為例,實現生產者-消費者:
補充:PipedOutputStream和PipedInputStream是管道輸出流和管道輸入流,配合使用可以實現執行緒間通訊。
  使用管道實現執行緒間通訊的主要流程如下:建立輸出流out和輸入流in,將out和in繫結,out中寫入的資料則會同步寫入的in的緩衝區(實際情況是,out中寫入資料就是往in的緩衝區寫資料,out中沒有資料緩衝區)。

 

程式碼弄丟了(๑ŐдŐ)b

3.其他執行緒通訊方法
除了以上2中通訊方式,還可以使用synchronized,以及FutureTask獲取返回值實現執行緒之間的通訊

程式碼弄丟了(๑ŐдŐ)b