Java中調用wait方法或者sleep方法都可以讓線程進入waitint或者time-waiting狀態,但是它們還是
有所不同的:
- wait是Object中的方法,而sleep則是Thread中的方法。
- sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized塊中使用。
- sleep方法只會讓出當前線程持有的時間片,而wait方法除了讓出時間片還會讓出當前線程持有的鎖。
如何證明呢?我設計了如下代碼來證明:
1 package com.basic.thread; 2 3 /** 4 * @author zhangxingrui 5 * @create 2019-02-20 21:37 6 **/ 7 public class WaitAndSleepDemo { 8 9 public static void main(String[] args) { 10 final Object object = new Object(); 11 12 try { 13 new Thread(new Runnable() { 14 @Override 15 public void run() { 16 System.out.println("線程A開始"); 17 synchronized (object){ 18 try { 19 System.out.println("線程A獲取到鎖"); 20 object.wait(1000); 21 System.out.println("線程A結束"); 22 } catch (InterruptedException e) { 23 e.printStackTrace(); 24 } 25 } 26 } 27 }).start(); 28 29 Thread.sleep(100); 30 31 new Thread(new Runnable() { 32 @Override 33 public void run() { 34 System.out.println("線程B開始"); 35 synchronized (object){ 36 try { 37 System.out.println("線程B獲取到鎖"); 38 Thread.sleep(1000); 39 System.out.println("線程B結束"); 40 } catch (InterruptedException e) { 41 e.printStackTrace(); 42 } 43 } 44 } 45 }).start(); 46 }catch (InterruptedException e){ 47 e.printStackTrace(); 48 } 49 } 50 51 }
輸出結果:
該段代碼的原理是先執行線程A,在進入synchonized之后調用wait方法,這個時候線程B也開始執行了;
而如果wait方法會釋放鎖的話,則B線程可以進入synchonized塊中執行,執行完畢后才釋放鎖給A線程繼續執行。