基本區別:
1、 sleep()來自Thread, wait() 來自Object
2、sleep可以在任何地方使用
wait只能在synchronized方法或者synchronized塊中使用 (因為wait會釋放鎖,所有只有獲取了鎖,才會釋放鎖)
最主要的本質區別
Thrad.sleep只會讓出CPU,不會導致鎖行為的改變
Object.wait不僅讓出CPU,還會釋放已經占有的同步鎖資源
public class WaitSleepDemo { public static void main(String[] args) { final Object lock = new Object(); new Thread(new Runnable() { @Override public void run() { System.out.println("thread A is waiting to get lock"); synchronized (lock){ try { System.out.println("thread A get lock"); Thread.sleep(20); System.out.println("thread A do wait method"); lock.wait(1000); System.out.println("thread A is done"); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); //為了讓Thread A 先於Thread B執行 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(new Runnable() { @Override public void run() { System.out.println("thread B is waiting to get lock"); synchronized (lock){ try { System.out.println("thread B get lock"); System.out.println("thread B is sleeping 10 ms"); Thread.sleep(10); System.out.println("thread B is done"); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }
執行結果:
thread A is waiting to get lock thread A get lock thread B is waiting to get lock thread A do wait method thread B get lock thread B is sleeping 10 ms thread B is done thread A is done
上面的代碼驗證了: Object.wait不僅讓出CPU,還會釋放已經占有的同步鎖資源
調整后的代碼
public class WaitSleepDemo { public static void main(String[] args) { final Object lock = new Object(); new Thread(new Runnable() { @Override public void run() { System.out.println("thread A is waiting to get lock"); synchronized (lock){ try { System.out.println("thread A get lock"); Thread.sleep(20); System.out.println("thread A do wait method"); //lock.wait(1000); Thread.sleep(1000); System.out.println("thread A is done"); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); //為了讓Thread A 先於Thread B執行 try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(new Runnable() { @Override public void run() { System.out.println("thread B is waiting to get lock"); synchronized (lock){ try { System.out.println("thread B get lock"); System.out.println("thread B is sleeping 10 ms"); // Thread.sleep(10); lock.wait(10); System.out.println("thread B is done"); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } }
打印結果:
thread A is waiting to get lock thread A get lock thread B is waiting to get lock thread A do wait method thread A is done thread B get lock thread B is sleeping 10 ms thread B is done
上面的代碼驗證了:Thrad.sleep只會讓出CPU,不會導致鎖行為的改變