Java 多线程 sleep方法与wait方法的区别

时间:2022-01-14 15:33:56

  sleep方法会使线程暂停执行一段时间,wait方法会阻塞线程,直到被唤醒或等待时间超时。

  两者区别具体如下:

  1 原理不同

  sleep方法是Thread类的静态方法,使线程暂停执行一段时间,等到计时结束,该线程会自动“苏醒”。而wait方法是Object类的非静态方法,用于线程间的通信,使线程等待,直到其他线程调用notify方法(或notifyAll方法)时才被唤醒。也可以通过计时即设置超时时间来自动唤醒该线程。

  2 对锁的处理机制不同

  sleep方法不涉及线程间通信,不会释放锁。而wait方法会使线程释放占有的锁。

  3 使用区域不同

  sleep方法可以放在任何地方,而wait方法只能放在同步块中。

  4 是否需要捕获异常不同

  sleep方法必须捕获异常,而wait、notify和notifyAll这些方法不需要捕获异常。在线程睡眠过程中,其他对象可能调用它的interrupt方法,抛出InterruptedException。

  综上所述,因为sleep方法不会释放锁,容易产生死锁问题,所以推荐使用wait方法。

 

  参考资料

  《Java程序员面试笔试宝典》 P149-150