CountDownLatch,interrupt, wait, notify, Thread各方法
阿新 • • 發佈:2019-01-22
【1】典型應用
CountDownLatch begin = new CountDownLatch(1);
begin.countDown(); //鎖計數減1
begin.await(); //阻塞等,直到begin為0,或當前執行緒被其他執行緒中斷
【2】Thread, 幾個一直然不清的方法
以下為Thread的自帶方法:
- interrupt() 中斷執行緒.
Thread.interrupt()方法,不會中斷一個正在執行的執行緒。這一方法實際上完成的是,線上程“受到阻塞”時丟擲一箇中斷訊號,這樣執行緒就得以退出阻塞的狀態。更確切的說,如果執行緒被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那麼,它將接收到一箇中斷異常(InterruptedException),從而提早地終結被阻塞狀態。
- sleep() 在指定的時間內讓當前正在執行的執行緒休眠(暫停執行)
- join() 等待該執行緒終止
- yield() 暫停當前正在執行的執行緒物件,並執行其他執行緒
以下為從Object繼承過來的方法,這也意味著每個物件都可以這樣:
- notify() 喚醒在此物件監視器上等待的單個執行緒
- notifyAll() 喚醒在此物件監視器上等待的所有執行緒
- wait() 導致當前的執行緒等待,直到其他執行緒呼叫此物件的notify()方法或notifyAll()方法
wait()允許我們將執行緒置入“睡眠”狀態,同時又“積極”地等待條件發生改變。而且只有在一個notify()或notifyAll()發生變化的時候,執行緒才會被喚醒,並檢查條件是否有變。
【3】wait() vs. sleep()/suspend()
- 例如,在synchronized(o)中,執行sleep()/suspend(),二者將霸氣的佔著o鎖不放,而wait()卻可以大方的放鎖。
- wait()只是暫時放棄o鎖,給其他執行緒用,最終還是要收回來,那什麼時候、怎麼收回來呢?notify()/notifyAll(),這裡暫不討論wait(timeout)的情況。
- 我們可將notify()/notifyAll()置入任何同步方法或同步塊內部,無論在那個類裡是否準備進行執行緒相關的處理。而且,我們也只能在同步方法或同步塊裡呼叫wait()和notify()。
【4】wait()/notify()示例程式碼:
synchronized(b){
try{
b.wait();
}catch(InterruptedException e){
}
}
synchronized(this){
try{
notify();
}catch(…){
}
}