Thread类中sleep()在java8官方文档中解释如下:
| static void | sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 |
| static void | sleep(long millis, int nanos) 导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。 |
由此可见,sleep在Thread类中是一个返回值为空的静态方法。其方法能让正在执行的线程暂时进入指定毫秒数的暂停,并返回一个InterruptedException的异常。
注:Thread类中sleep(long millis)并不能通过传入0或1来实现永久等待,这样的代码并无意义.
public final void wait(long timeout) //超时timeout毫秒
throws InterruptedException
根据java8官方文档:Thread类中wait(long timeout)导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法或指定timeout的时间已过。
此外,Thread类中还存在两个与其构成重载的方法:
public final void wait()
throws InterruptedException //相当于wait(0),线程等待,直至只能由另一个线程调
//用该对象的notify()方法或notifyAll()方法
public final void wait(long timeout,
int nanos) //由timeout毫秒加nanos纳秒参数指定的超时时间已过。
throws InterruptedException //timeout - 以毫秒为单位等待的最长时间。
//nanos - 额外的时间,以纳秒范围0-999999。
//具体计算方式1000000*timeout+nanos (单位:纳秒)
注意:wait方法,因为它将当前线程放入该对象的等待集,仅解锁此对象; 当前线程可以同步的任何其他对象在线程等待时保持锁定。该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方法的说明,请参阅notify方法.
综上所述:
sleep和wait的区别:
| 区别 方法名 | 声明位置 | 使用场景不同 | 是否释放同步监视器 |
| sleep | 属于Thread类 | 任何场景都能调用 | 释放锁 |
| wait | 属于Object类 | 必须在同步代码块或同步方法中 | 不会释放锁 |



