1. 程式人生 > >CountDownLatch,interrupt, wait, notify, Thread各方法

CountDownLatch,interrupt, wait, notify, Thread各方法

【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()

  1. 例如,在synchronized(o)中,執行sleep()/suspend(),二者將霸氣的佔著o鎖不放,而wait()卻可以大方的放鎖。
  2. wait()只是暫時放棄o鎖,給其他執行緒用,最終還是要收回來,那什麼時候、怎麼收回來呢?notify()/notifyAll(),這裡暫不討論wait(timeout)的情況。
  3. 我們可將notify()/notifyAll()置入任何同步方法或同步塊內部,無論在那個類裡是否準備進行執行緒相關的處理。而且,我們也只能在同步方法或同步塊裡呼叫wait()和notify()。

【4】wait()/notify()示例程式碼:

synchronized(b){

      try{

           b.wait();

      }catch(InterruptedException e){

      }

}

synchronized(this){

      try{

          notify();

      }catch(…){

      }

}