所有Java.lang.Object的子類都從Object類繼續了3個wait和1個notity()及1個notifyAll()方法。具體的區別看相關的API。有時或者你還想使用sleep方法,notify方法的呼叫,會使當前執行緒進行阻塞狀態,三個notify的區別,有的是直接加入到阻塞佇列中,有的是阻塞一定的時間,但是不論哪種,沒有本質區別,因為一旦加入到了阻塞佇列,執行緒的優先順序並不會改變,也就是說,只要你不去呼叫喚醒,注意是喚醒程序的notify()或者notifyAll()方法,執行緒會一直阻塞,除非你呼叫了,執行緒才會從阻塞狀態變成可執行狀態(runnable),注意是 可執行,並不是說立即馬上就會執行,對於處於可執行狀態的多個執行緒來說,由JVM根據當前執行緒池當中的可執行狀態的執行緒的優先順序來決定,Java中的執行緒執行是完成根據優先順序搶佔式執行的,也就是說,高優先順序的執行緒會首先獲得執行,當然正在執行的執行緒也會被比他高的執行緒把中斷,至於中斷的具體細節需要你寫相關的程式碼測試,JVM實現這個功能的程式碼是不開源的。可能最讓人迷惑的就是同優先順序,或者預設優先順序執行緒的執行順序,我來告訴你,同優先順序的順序在JVM規範裡是這麼講的:同優先順序的執行緒的執行順序是不確定的,JVM本身不支援多執行緒,JDK1.5時,當前1.6.24的版本不太清楚,除非當前JVM所在的作業系統支援多執行緒,就像現在的多核系統,JVM有可能會支援多執行緒的處理,注意JVM不具有跨平臺性。。。,所以在多核下的多執行緒是一個非常值得測試的東西。除非當前的作業系統技術多執行緒,JVM才有可能支援多執行緒的處理,注意是有可能。並且JVM規範裡說了,Java下所有線上程上的操作,程式的正確性永遠不要依賴於執行緒的優先順序。也就是說不要希望透過修改執行緒的優先順序來決定程式執行順序的正確性。解決這個問題最好的辦法,我用的還是同步和互斥。透過他來共享操作。主要原因還是隻有一個,同優先順序執行緒併發執行是完全不可猜測的。完全隨機,因素包括當前JVM的狀態,可以這麼想象一下,如果當前有多個執行緒需要執行,在JVM有限的資源上,不同的執行緒所要的資源和使用這些資源的時間是不同的,這也就決定了,在JVM的設計上,會根據一定的演算法,來決定這些執行緒執行的順序,否則同時裝載幾個需要大量資源的執行緒將導致JVM崩潰等等,其實是沒有太大意義的,也頂多只是讓當前執行緒進行可執行狀態,進行等待佇列,等待執行罷了。 希望你能明白。好長時間不看書,完全是看到這個問題,想起來的,可能有點亂。如果想再深入明白,包括執行緒具體是怎麼實現的,可以找JVM規範相關的書看看。 對執行緒最好的學習,就是寫程式測試執行緒,多設斷點 ,來跟蹤,透過每次執行的不同的可能的結果來經驗化的學習。 最後說一句:notify() notifiAll()只會讓執行緒從阻塞狀態變成可執行狀態,runnable 到 run狀態,狀態的變化是由JVM來完成。換句話說,就是程式裡的run()方法的呼叫。 這種隨機執行其實完全是因為特定的演算法,和當前JVM的執行狀態。換句話說,其實並不是真的隨機。
所有Java.lang.Object的子類都從Object類繼續了3個wait和1個notity()及1個notifyAll()方法。具體的區別看相關的API。有時或者你還想使用sleep方法,notify方法的呼叫,會使當前執行緒進行阻塞狀態,三個notify的區別,有的是直接加入到阻塞佇列中,有的是阻塞一定的時間,但是不論哪種,沒有本質區別,因為一旦加入到了阻塞佇列,執行緒的優先順序並不會改變,也就是說,只要你不去呼叫喚醒,注意是喚醒程序的notify()或者notifyAll()方法,執行緒會一直阻塞,除非你呼叫了,執行緒才會從阻塞狀態變成可執行狀態(runnable),注意是 可執行,並不是說立即馬上就會執行,對於處於可執行狀態的多個執行緒來說,由JVM根據當前執行緒池當中的可執行狀態的執行緒的優先順序來決定,Java中的執行緒執行是完成根據優先順序搶佔式執行的,也就是說,高優先順序的執行緒會首先獲得執行,當然正在執行的執行緒也會被比他高的執行緒把中斷,至於中斷的具體細節需要你寫相關的程式碼測試,JVM實現這個功能的程式碼是不開源的。可能最讓人迷惑的就是同優先順序,或者預設優先順序執行緒的執行順序,我來告訴你,同優先順序的順序在JVM規範裡是這麼講的:同優先順序的執行緒的執行順序是不確定的,JVM本身不支援多執行緒,JDK1.5時,當前1.6.24的版本不太清楚,除非當前JVM所在的作業系統支援多執行緒,就像現在的多核系統,JVM有可能會支援多執行緒的處理,注意JVM不具有跨平臺性。。。,所以在多核下的多執行緒是一個非常值得測試的東西。除非當前的作業系統技術多執行緒,JVM才有可能支援多執行緒的處理,注意是有可能。並且JVM規範裡說了,Java下所有線上程上的操作,程式的正確性永遠不要依賴於執行緒的優先順序。也就是說不要希望透過修改執行緒的優先順序來決定程式執行順序的正確性。解決這個問題最好的辦法,我用的還是同步和互斥。透過他來共享操作。主要原因還是隻有一個,同優先順序執行緒併發執行是完全不可猜測的。完全隨機,因素包括當前JVM的狀態,可以這麼想象一下,如果當前有多個執行緒需要執行,在JVM有限的資源上,不同的執行緒所要的資源和使用這些資源的時間是不同的,這也就決定了,在JVM的設計上,會根據一定的演算法,來決定這些執行緒執行的順序,否則同時裝載幾個需要大量資源的執行緒將導致JVM崩潰等等,其實是沒有太大意義的,也頂多只是讓當前執行緒進行可執行狀態,進行等待佇列,等待執行罷了。 希望你能明白。好長時間不看書,完全是看到這個問題,想起來的,可能有點亂。如果想再深入明白,包括執行緒具體是怎麼實現的,可以找JVM規範相關的書看看。 對執行緒最好的學習,就是寫程式測試執行緒,多設斷點 ,來跟蹤,透過每次執行的不同的可能的結果來經驗化的學習。 最後說一句:notify() notifiAll()只會讓執行緒從阻塞狀態變成可執行狀態,runnable 到 run狀態,狀態的變化是由JVM來完成。換句話說,就是程式裡的run()方法的呼叫。 這種隨機執行其實完全是因為特定的演算法,和當前JVM的執行狀態。換句話說,其實並不是真的隨機。