JAVA_Lesson14(傳智播客筆記之多執行緒)
多執行緒間通訊-示例
之間是很多執行緒都在執行同一項任務,但是現在他們處理的任務不同(處理的還是同一資源)。
執行緒間通訊-等待喚醒機制(握手機制)
應該有個判斷裡面是否有資源的標記flag,判斷是否有資源。
如果裡面有資源的話,應該輸出開始操作,而輸入應該先釋放執行權,再釋放執行資格,處於凍結狀態。Sleep、wait。
If(flag)
輸出處於wait
那麼輸出就可以運行了。
等待喚醒機制涉及的方法:
1. wait():讓執行緒處於凍結狀態,釋放cpu的執行權和執行資格,被wait的執行緒會被儲存到執行緒池(等待集)中。
2. Notify():喚醒執行緒池中的一個執行緒(任意)。
3. NotifyAll():喚醒執行緒池中的所有執行緒。
在之前的程式碼基礎上加入了flag判斷機制
這些方法都必須定義在同步中。因為這些方法是用於操作執行緒狀態的方法。必須明確到底操作的是哪個鎖上的執行緒。
為什麼操作執行緒的方法wait notify notifyAll定義在Object類中。因為這些方法是監視器的方法,監視器其實就是鎖。鎖可以是任意物件,任意物件呼叫的方法一定定義在Object類中。
等待喚醒機制-程式碼優化
多生產者多消費者問題(暫時跳過)
Wait和sleep的區別
1.Wait可以指定時間,也可以不指定。Sleep必須指定時間
2.在同步中時,對cpu的執行權和鎖的處理不同。
Wait:釋放執行權,釋放執行權,但是不釋放鎖(我猜錯了)釋放鎖
Sleep:釋放執行權,不釋放鎖。
停止執行緒方式-定義標記
1. stop方法(已過時)
2. Run方法結束
怎麼控制執行緒的任務結束呢?
任務中都會有迴圈結構,只要控制住迴圈就可以結束任務。控制迴圈通常就用定義標記來完成。
守護執行緒-setDaemo(boolean daemon)更改執行緒組後臺狀態
將該執行緒標記為守護執行緒或使用者執行緒。當正在執行的執行緒均是守護執行緒時,java虛擬機器退出。(和前臺聯合起來,前臺沒了,我就沒了,和前臺保持一致)
其他方法-join等(等待該執行緒終止)
主執行緒等待其他執行緒終止以後。(主執行緒交出執行資格,自身處於凍結狀態)
臨時加入一個執行緒運算可以使用join方法。
執行緒還涉及到優先順序的問題,能夠獲取到cpu的機率。優先順序越大,獲取的機率越高。
T(執行緒).setPriority()可以設定執行緒的優先順序,裡面傳的引數就是設定的優先順序。
PS:還剩集合和IO,加油好好學。