Java 中wait()与sleep()方法
一、wait()
wait()方法的作用是让获取到锁的线程释放锁并进入等待阻塞。所以wait()方法必须在获取到锁时才可调用,否则会抛出异常,例:
public class Test{ public static void main(String[] args) throws InterruptedException { Test test = new Test(); test.wait(); } }
输出:
wait调用时可以指定等待最长多久,否则线程将会无限制等待,直到被notify或notifyAll方法唤醒。
wait方法的使用场景:wait方法通常用于需要某个资源才能继续执行代码,且该资源是通过其它线程获取锁并准备的。此时可以释放锁并加入等待。通常结构如下:
synchronized(lock) { while(条件不成立) { lock.wait(); } // 条件成立了,干活 } // 另一个线程 synchronized(lock) { // 准备资源 lock.notifyAll(); }
二、sleep()
-
sleep()方法会让当前线程进入阻塞;
-
如果当前线程占有某个锁,sleep进入阻塞时不会释放锁;
-
sleep方法的调用必须指定睡眠时间;
-
sleep方法是Thread上的静态方法。
三、wait()与sleep()的区别
-
wait进入的线程必须通过notify或notifyAll方法唤醒。
-
wait方法的调用需要当前线程获取到锁,即在synchronized方法中才能调用。
-
wait方法是Object中的实例方法,sleep是Thread中的静态方法。
-
wait方法会使当前线程释放锁,再进入阻塞等待,而sleep不会释放锁。