Java中sleep()與wait()區別

學習時正好碰到這兩個方法,就查閱相關資料,並通過程序實現,進行區別一下:

1、每個對象都有一個鎖來控制同步訪問,Synchronized關鍵字可以和對象的鎖交互,來實現同步方法或同步塊。sleep()方法正在執行的線程主動讓出CPU(然後CPU就可以去執行其他任務),在sleep指定時間後CPU再回到該線程繼續往下執行(注意:sleep方法只讓出了CPU,而並不會釋放同步資源鎖!!!);wait()方法則是指當前線程讓自己暫時退讓出同步資源鎖,以便其他正在等待該資源的線程得到該資源進而運行,只有調用了notify()方法,之前調用wait()的線程纔會解除wait狀態,可以去參與競爭同步資源鎖,進而得到執行。(注意:notify的作用相當於叫醒睡着的人,而並不會給他分配任務,就是說notify只是讓之前調用wait的線程有權利重新參與線程的調度);

2、sleep()方法可以在任何地方使用;wait()方法則只能在同步方法或同步塊中使用;

3、sleep()是線程線程類(Thread)的方法,調用會暫停此線程指定的時間,但監控依然保持,不會釋放對象鎖,到時間自動恢復;wait()是Object的方法,調用會放棄對象鎖,進入等待隊列,待調用notify()/notifyAll()喚醒指定的線程或者所有線程,纔會進入鎖池,不再次獲得對象鎖纔會進入運行狀態;


以程序說明:

[java] view plain copy
  1. public class MultiThread {  
  2.   
  3.     private static class Thread1 implements Runnable{         
  4.         @Override  
  5.         public void run() {  
  6.             //由於 Thread1和下面Thread2內部run方法要用同一對象作爲監視器,如果用this則Thread1和Threa2的this不是同一對象  
  7.             //所以用MultiThread.class這個字節碼對象,當前虛擬機裏引用這個變量時指向的都是同一個對象  
  8.             synchronized(MultiThread.class){  
  9.                 System.out.println("enter thread1 ...");  
  10.                 System.out.println("thread1 is waiting");  
  11.                   
  12.                 try{  
  13.                     //釋放鎖有兩種方式:(1)程序自然離開監視器的範圍,即離開synchronized關鍵字管轄的代碼範圍  
  14.                     //(2)在synchronized關鍵字管轄的代碼內部調用監視器對象的wait()方法。這裏使用wait方法  
  15.                     MultiThread.class.wait();  
  16.                 }catch(InterruptedException e){  
  17.                     e.printStackTrace();  
  18.                 }  
  19.                   
  20.                 System.out.println("thread1 is going on ...");  
  21.                 System.out.println("thread1 is being over!");  
  22.             }  
  23.         }  
  24.           
  25.     }  
  26.       
  27.     private static class Thread2 implements Runnable{  
  28.         @Override  
  29.         public void run() {   
  30.             //notify方法並不釋放鎖,即使thread2調用了下面的sleep方法休息10ms,但thread1仍然不會執行  
  31.             //因爲thread2沒有釋放鎖,所以Thread1得不到鎖而無法執行  
  32.             synchronized(MultiThread.class){  
  33.                 System.out.println("enter thread2 ...");  
  34.                 System.out.println("thread2 notify other thread can release wait status ...");  
  35.                 MultiThread.class.notify();  
  36.                 System.out.println("thread2 is sleeping ten millisecond ...");  
  37.                   
  38.                 try{  
  39.                     Thread.sleep(10);  
  40.                 }catch(InterruptedException e){  
  41.                     e.printStackTrace();  
  42.                 }  
  43.                   
  44.                 System.out.println("thread2 is going on ...");  
  45.                 System.out.println("thread2 is being over!");  
  46.             }  
  47.         }         
  48.     }  
  49.       
  50.     public static void main(String[] args) {  
  51.         new Thread(new Thread1()).start();  
  52.         try{  
  53.             Thread.sleep(10);  
  54.         }catch(InterruptedException e){  
  55.             e.printStackTrace();  
  56.         }  
  57.   
  58.         new Thread(new Thread2()).start();  
  59.     }  
  60.   
  61. }  

程序運行結果如下圖所示



發佈了129 篇原創文章 · 獲贊 63 · 訪問量 79萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章