黑馬程序員-wait和sleep的作用和區別

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

package com.itcast.test2;
/**
 * wait方法和sleep方法有什麼作用,區別是什麼?
 * sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,
 * 但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。
 *  wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,
 *  進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後
 *  本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。) 
 * @author shandawang
 *
 */
public class MultiThread {
     public static void main(String[] args) {
          // TODO Auto-generated method stub
          new Thread(new Thread1()).start();
          try {
              Thread.sleep(500);
          } catch (InterruptedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
          new Thread(new Thread2()).start();         
     }
     private static class Thread1 implements Runnable
     {
          @Override
          public void run() {
              // TODO Auto-generated method stub
        	  //由於這裏的Thread1和下面的Thread2內部run方法要用同一對象作爲監視器,我們這裏不能用this,
        	  //因爲在Thread2裏面的this和這個Thread1的this不是同一個對象。我們用MultiThread.class這個
        	  //字節碼對象,當前虛擬機裏引用這個變量時,指向的都是同一個對象。
              synchronized (MultiThread.class) {

                   System.out.println("enter thread1...");

                   System.out.println("thread1 is waiting");

                   try {
                	   //釋放鎖有兩種方式,第一種方式是程序自然離開監視器的範圍,也就是離開了synchronized關鍵字管轄的
                	   //代碼範圍,另一種方式就是在synchronized關鍵字管轄的代碼內部調用監視器對象的wait方法。這裏,使用wait方法釋放鎖。
                        MultiThread.class.wait();
                   } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                   }
                   System.out.println("thread1 is going on...");
                   System.out.println("thread1 is being over!");             
              }
          }
     }
     private static class Thread2 implements Runnable
     {
          @Override
          public void run() {
              // TODO Auto-generated method stub
              synchronized (MultiThread.class) {
                   System.out.println("enter thread2...");
                   System.out.println("thread2 notify other thread can release wait status..");
                   //由於notify方法並不釋放鎖, 即使thread2調用下面的sleep方法休息了500毫秒,但thread1仍然
                   //不會執行,因爲thread2沒有釋放鎖,所以Thread1無法得不到鎖。
                   MultiThread.class.notify();
                  // System.out.println("thread2 is sleeping ten millisecond...");
                   System.out.println("thread2 is waiting, other thread can run now...");
                   try {
                        //Thread.sleep(10);
                        MultiThread.class.wait();
                   } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                   }
                   System.out.println("thread2 is going on...");
                   System.out.println("thread2 is being over!");
              }
          }
     }    
}

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章