第十四章 多執行緒2
阿新 • • 發佈:2019-01-26
14.1 執行緒間通訊
多個執行緒處理同一資源,但任務不同。
14.2 等待喚醒機制
wait(), notify(), notifyAll()
這些監視器方法定義在Object類中。使用時必須定義在同步中,且應明確操作於哪個鎖上的執行緒。
14.3 多生產者多消費者問題
while多次迴圈 判斷標誌,以選擇繼續執行或者wait().
notifyAll喚醒,避免while中wait引發的死鎖。
14.4 Lock介面
提供了比synchronized方法或語句更廣泛與靈活的鎖定操作。
14.5 condition介面Lock lock = new xxxLock(); function { lock.lock(); //code... lock.unlock(); //若有可能丟擲異常,unlock放到finally語句 }
將Object的wait(),notify(),notifyAll(),分解成不同的物件,以便將這些物件與Lock組合使用
await(), signal(), signalAll();
condition c1 = lock.newCondition();
condition c2 = lock.newCondition();
14.6 wait和sleep的區別
1)wait可以不指定時間;sleep必須指定時間。
2)在同步中:wait釋放執行權,釋放鎖;sleep釋放執行權,不釋放鎖。
14.7 停止執行緒的方式
1)run()結束
2)stop()將釋放其鎖定的所有監視器,可能使受這些監視器保護的物件處於不一致的狀態。
如何控制執行緒任務的結束:
任務中都有迴圈結構,通過控制迴圈控制執行緒結束。
while(flag) 定義標記。
如果執行緒處於凍結狀態,將無法讀取標記判斷,則使用interrupt()將執行緒從凍結狀態中恢復到1執行狀態,並丟擲interruptedException
14.8 執行緒的其他方法
1)setDaemon() 將執行緒標記為守護執行緒或使用者執行緒
2)join() 該執行緒申請加入執行,並等待該執行緒終止
3)setPriority()優先順序1-10,三個常量MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY
4) yield()暫定、切執行緒