Java多线程设计模式(1)
1 線程中的幾個方法解釋
Thread.sleep(long 毫秒)
在指定的時間內讓當前線程休眠,將控制權交給其他線程,休眠的線程依舊擁有它所占用的鎖,
Thread.yield();
暫停或者放棄當前正在執行的線程,并且執行其他線程,但是并沒有釋放該線程所擁有的鎖,線程放棄后,讓其他相同或者更高線程得以運行。
t.join()
在A線程中等待t線程,可以指定一定時間后繼續執行或者無限等待
t.interrupt()
中斷t的線程,可以喚醒打斷處于sleep,join和wait狀態下的線程,
p.wait()
線程可以等待一個它鎖定的對象,在等待的時候,它會釋放此對象的鎖并且暫停進入休眠,它會在時間到期、該線程被中斷和對象得到通知之前一直保持休息。直到它得到了其他線程的通知,如該對象調用notify()和notifyAll()的時候才會執行。
對于使用wait和notify與notifyAll的時候均要先利用同步代碼塊或者同步方法獲取該對象的鎖,利用wait后,會首先獲取該對象鎖,然后進入該對象的wait set中,暫停當前的線程,釋放該對象的鎖,在該對象的wait set等待著
對于直接wait()就是this.wait(),執行wait()的線程會在this的wait set中等待著。
Yield和Sleep區別
? ? ? ?sleep 方法使當前運行中的線程睡眠一段時間,進入不可以運行狀態,這段時間的長短是由程序設定的,它只有被吵醒或者睡眠時間到才會繼續運行;
? ? ? ?yield方法使當前線程讓出CPU占有權即時間片,重新排隊,但讓出的時間是不可設定的,該線程依然是可運行狀態
? ? ? ?yield()方法對應了如下操作:先檢測當前是否有相同優先級的線程處于同可運行狀態,如有,則把CPU的占有權交給該線程,否則繼續運行原來的線程,所以yield()方法稱為“退讓”,它把運行機會讓給了同等級的其他線程。
sleep 方法允許較低優先級的線程獲得運行機會,但yield()方法執行時,當前線程仍處在可運行狀態,它在隊列中等候cpu調用,所以說是可運行狀態(注意不是運行狀態),所以不可能讓出較低優先級的線程此時獲取CPU占有權。在一個運行系統中,如果較高優先級的線程沒有調用sleep方法,也沒有受到I/O阻塞,那么較低優先級線程只能等待所有較高優先級的線程運行結束,方可有機會運行。
yield()只是使當前線程重新回到可運行狀態,所有執行yield()的線程有可能在進入到可運行狀態后馬上又被執行,所以yield()方法只能使同優先級的線程有執行的機會
2 線程的啟動
? ?線程的啟動永遠都是調用Start()方法開始的, Thread.start ()方法啟動線程,使之進入就緒狀態,當 cpu 分配時間片給該線程時,由 JVM 調度執行 run ()方法, 之所以要start和run方法的原因是,因為 JVM 創建一個單獨的線程不同于普通方法的調用,啟動一個線程是由start 方法完成,start 由本地方法實現,需要顯示地被調用。Run方法是真正執行的任務部分,另一個好處就是在于當一個對象需要繼承多類的時候,此時就可以將具體的任務實現了 Runnable 接口,然后傳遞給Thread中,避免因繼承了 Thread 類而造成的 Java 的多繼承問題。
? ?對于同一個Thread類的實例變量,只能調用一次Start方法,一旦調用start方法,就會變成結束start狀態,當其再次調用start方法的時候,就會出現IllegalThreadStateException,就會進行退讓讓線程的啟動不會再次執行。Thread類的start方法采用的就是Balking Pattern模式。
? ?多線程都是針對多個線程操作同一個對象下作用的。
3 Single Threaded Execution Pattern
? ?Single Threaded Execution指的就是“只允許一個線程執行”的意思,它表明對于調用這個方法或對象的時候必須只能讓一個線程來執行。利用synchronized來設置對象的監聽器,在synchronized方法體或者同步塊中。必須要注意synchronized實例方法共享的是類的實例對象的鎖,而synchronized類方法即static synchronized的方法共享的是類的鎖,這兩把鎖完全不同。
? ?對于一個對象的某一個方法,當有多個線程需要訪問的時候,這些線程是共享這個對象的所有成員屬性的。線程是共享這個對象的內存。
? ?Single Threaded Execution中,作為共享資源的類,即可以被多個線程訪問的。有兩種方法,安全方法和非安全方法,所謂的安全方法就是多個線程調用也不會出現問題。而非安全方法在多個線程訪問的過程可能會出現問題。需要對于非安全方法做處理。
適用性:當共享資源類的實例可能被多個線程訪問的時候,實例的狀態即屬性會被修改,在多個線程中,此時就需要對于對于實例的狀態發生變化的范圍作為臨界區,利用synchronized來保護,實現臨界區間,來監聽多線程的訪問。
4 Immutable Pattern
? ?Immutable Pattern指的就是“有著能夠保證實例的狀態絕不會發生變化更改的類”,再次說明這里指實例的狀態都是指的是類的成員屬性。所謂的不能發生變化,也就是對于類的狀態只允許賦值一次,且不會給外界提供任何setter方法,并且屬性是private final,一般通過在構造器來對于這些狀態賦值,當然也可以將類聲明為final。利用這種方式,就克服利用共享互斥機制來造成的時間浪費。
? ?Immutable Pattern參與者是一個字段值無法更改的類,也沒有任何用來更改字段值的方法。當Immutable參與者的實例一旦創建后,狀態就固定下來,無法更改了。
適用性:當實例產生后,狀態不再發生變化。實例需要多個線程共享,訪問很頻繁的時候。
5 Guarded Suspension Pattern--要等到我準備好再通知你們喲
? Guarded Suspension指的意思是“在多線程中,當線程訪問某一個資源時候,此時并不適合馬上執行某個操作時,就要求想要執行該操作的線程必須等待。”Guarded是“被保護的”,suspension是“暫停”的意思。
? Guarded Suspension要求線程必須等待。利用的就是wait,再通過notifyAll來通知所有等待的線程。將線程要執行某一個操作,必須滿足的條件稱為警戒條件。每個線程在執行的時候,如果不滿足警戒條件就必須在等待,只有收到通知后,判斷警戒條件成功后,才能進而執行所要的目的操作。
? 常用的警戒條件結構如下:
?public synchronized void methodName()
?{
? ? ? while(警戒條件的否定)
? ? ? ? ? 使用wait;//這里直接在共享類中wait,所有等待的都會進入該類實例的this wait set中等候
? ? ?//跳出循環,說明滿足警戒條件
? ? ? 執行目的操作。
? }
注:不能將while替換為if,因為凡是處于等待中的線程一旦獲得喚醒,就必須在執行目的操作之前先進行警戒條件的判斷才能進而執行目的操作。必須將捕獲wait的異常包括在while循環體中,否則一旦發生異常可能就會進而執行目的操作。這里的wait也不能換為sleep,因為利用sleep該線程會一直擁有它所獲得鎖。
在這里wait和notify都是隱藏在共享資源中,這樣凡是使用該共享資源的線程就不需要考慮這些問題了。
GuardedObject參與者是一個擁有被防衛的方法guardedMethod,一般就是利用synchronized來修飾,在線程執行這個方法的時候,只要滿足警戒條件就會執行,否則就會一直等待。警戒條件會隨著實例的狀態變化而變化。還需要一個更改實例狀態的方法stateChangingMethod,來通知那些等待的線程。
一般使用while語句和wait方法來實現guardedMethod,使用notify和notifyAll來實現stateChangingMethod
6 Balking Pattern
?Balking Pattern指的是“多線程訪問共享資源時候,當現在不適合進行這個操作,或者沒有必要進行這個操作的時候,此時就會直接放棄進行這個操作而返回”。
?Balking Pattern也是需要警戒條件的。GuardedObject參與者是一個擁有被防衛的方法guardedMethod,一般就是利用synchronized來修飾,在線程執行這個方法的時候,只要滿足警戒條件就會執行,否則就會。警戒條馬上返回,直接退出該方法。警戒條件的成立會隨著實例的狀態變化而變化。還需要一個更改實例狀態的方法stateChangingMethod,來通知那些等待的線程。
? 警戒條件的結構:
?public synchronized void guardedMethod()
?{
? ? ?if(警戒條件否定)
? ? ? ? return ;
? ? ? ?//警戒條件滿足情況
? ? ?目的操作
? ?}
適用性:在線程訪問警戒條件不成立的時候,不需要刻意執行等待的時候,不想一直等待警戒條件成立的時候,或者警戒條件只有第一次成立的時候。注意線程的start方法就是利用這種方式的,即只有第一次成立的時候才會調用,第二次調用就會出錯。
轉載于:https://blog.51cto.com/computerdragon/1201769
總結
以上是生活随笔為你收集整理的Java多线程设计模式(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exchange安装
- 下一篇: 云计算成IT反“腐”后盾-《中国电子报》