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线程继续执行。