第一个区别:sleep是静态方法,wait是祖先类Object的成员方法:
Sleep是一个静态的方法,使用Thread类来调用,在哪个线程中调用了该方法,哪个线程休眠;
Wait方法是object类的方法,和对象相关,表示的是使得当前线程对象(线程实例)等待。
看下面的代码:
package hello_java;
public class Sleep_Wait {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(() -> System.out.println("T1...."));
t1.start();
Thread t2 = new Thread(() -> System.out.println("T2..."));
t2.start();
Thread.sleep(500);
t2.wait();
System.out.println("main 方法的执行");
}
}
这个程序会报出异常:
异常的原因在于,在wait的时候,wait是会释放锁的,因此必须要拿到锁才行,拿到锁才能释放锁。所以对应的解决办法是这样的:
package hello_java;
public class Sleep_Wait {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(() -> System.out.println("T1...."));
t1.start();
Thread t2 = new Thread(() -> System.out.println("T2..."));
t2.start();
Thread.sleep(500);
synchronized (t2){
t2.wait();
}
System.out.println("main 方法的执行");
}
}
区别二:是否释放锁
他们两个都能够让线程进入阻塞的状态,但是wait会释放锁(对于资源类的锁),即会释放资源;sleep是睡,但是不会释放锁,会将锁对应的资源牢牢地攥在自己的手中,只是会让出CPU,让别的线程获得执行,但是不会让别的线程操作自己手中握着的资源类。