【1】典型應用
CountDownLatch begin = new CountDownLatch(1);
begin.countDown(); //鎖計數減1
begin.await(); //阻塞等,直到begin為0,或當前線程被其他線程中斷
http://man.ddvip.com/program/java_api_zh/java/util/concurrent/CountDownLatch.html
【2】Thread, 幾個一直然不清的方法
以下為Thread的內建方法:
Thread.interrupt()方法,不會中斷一個正在啟動並執行線程。這一方法實際上完成的是,線上程“受到阻塞”時拋出一個中斷訊號,這樣線程就得以退出阻塞的狀態。更確切的說,如果線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那麼,它將接收到一個中斷異常(InterruptedException),從而提早地終結被阻塞狀態。
- sleep() 在指定的時間內讓當前正在執行的線程休眠(暫停執行)
- join() 等待該線程終止
- yield() 暫停當前正在執行的線程對象,並執行其他線程
http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/lang/Thread.html#interrupt()
以下為從Object繼承過來的方法,這也意味著每個對象都可以這樣:
- notify() 喚醒在此對象監視器上等待的單個線程
- notifyAll() 喚醒在此對象監視器上等待的所有線程
- wait() 導致當前的線程等待,直到其他線程調用此對象的notify()方法或notifyAll()方法
wait()允許我們將線程置入“睡眠”狀態,同時又“積極”地等待條件發生改變。而且只有在一個notify()或notifyAll()發生變化的時候,線程才會被喚醒,並檢查條件是否有變。
http://www.gznc.edu.cn/yxsz/jjglxy/book/Java_api/java/lang/Object.html#notify()
【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(…){
}
}
http://wenku.baidu.com/view/ed6dceea19e8b8f67c1cb9e8.html