java線程通信通信
① 如何在學習java過程中實現線程之間的通信
在java中,每個對象都有兩個池,鎖池(monitor)和等待池(waitset),每個對象又都有wait、notify、notifyAll方法,使用它們可以實現線程之間的通信,只是平時用的較少.
wait(): 使當前線程處於等待狀態,直到另外的線程調用notify或notifyAll將它喚醒
notify(): 喚醒該對象監聽的其中一個線程(規則取決於JVM廠商,FILO,FIFO,隨機…)
notifyAll(): 喚醒該對象監聽的所有線程
鎖池: 假設T1線程已經擁有了某個對象(注意:不是類)的鎖,而其它的線程想要調用該對象的synchronized方法(或者synchronized塊),由於這些線程在進入對象的synchronized方法之前都需要先獲得該對象的鎖的擁有權,但是該對象的鎖目前正被T1線程擁有,所以這些線程就進入了該對象的鎖池中.
等待池: 假設T1線程調用了某個對象的wait()方法,T1線程就會釋放該對象的鎖(因為wait()方法必須出現在synchronized中,這樣自然在執行wait()方法之前T1線程就已經擁有了該對象的鎖),同時T1線程進入到了該對象的等待池中.如果有其它線程調用了相同對象的notifyAll()方法,那麼處於該對象的等待池中的線程就會全部進入該對象的鎖池中,從新爭奪鎖的擁有權.如果另外的一個線程調用了相同對象的notify()方法,那麼僅僅有一個處於該對象的等待池中的線程(隨機)會進入該對象的鎖池.
java實現線程間通信的四種方式
1、synchronized同步:這種方式,本質上就是「共享內存」式的通信。多個線程需要訪問同一個共享變數,誰拿到了鎖(獲得了訪問許可權),誰就可以執行。
2、while輪詢:其實就是多線程同時執行,會犧牲部分CPU性能。
3、wait/notify機制
4、管道通信:管道流主要用來實現兩個線程之間的二進制數據的傳播
② Java中線程間怎麼通訊什麼叫僵死線程
死鎖?兩個線程互相占著資源,其中一個sleep了就死那了
③ java中為什麼線程通信的方法wait(), notify()和notifyAll()被定義在Object類里
Java的每個對象中都有一個鎖(monitor,也可以成為監視器) 並且wait(),notify()等方法用於等待對象的鎖或者通知其他線程對象的監視器可用。在Java的線程中並沒有可供任何對象使用的鎖和同步器。
這就是為什麼這些方法是Object類的一部分,這樣Java的每一個類都有用於線程間通信的基本方法
④ java的線程之間如何進行消息傳遞
原生Java線程之間只能通過共享內存(同一個虛擬機內)來通信,當然你可以通過自己實現,使得線程看起來可以通過消息通信(比如Scala的Actor)
可以通過消息傳遞,但Actor本身和線程是有很大不同,不過看起來具備了一些線程功能。