1. 程式人生 > >第十四章 多執行緒2

第十四章 多執行緒2

14.1 執行緒間通訊

多個執行緒處理同一資源,但任務不同。

14.2 等待喚醒機制

wait(), notify(), notifyAll()

這些監視器方法定義在Object類中。使用時必須定義在同步中,且應明確操作於哪個鎖上的執行緒。

14.3 多生產者多消費者問題

while多次迴圈 判斷標誌,以選擇繼續執行或者wait().

notifyAll喚醒,避免while中wait引發的死鎖。

14.4 Lock介面

提供了比synchronized方法或語句更廣泛與靈活的鎖定操作。

Lock lock = new xxxLock();
function {
lock.lock();
//code...
lock.unlock(); //若有可能丟擲異常,unlock放到finally語句
}
14.5 condition介面

將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()暫定、切執行緒