摘要:介绍sleep方法和wait方法的相同点和区别。
在JAVA多线程的学习中,不少人会把函数sleep和wait搞混,傻傻分不清,简单粗暴地认为都是使得线程进入等待状态,比如就分不清方法sleep(long)和wait(long)。下面主要介绍sleep方法和wait方法的相同点和区别。
关于sleep() 和 wait()方法的异同点是什么的问题,首先需要明白的是sleep()是Thread的静态本地方法,wait()是Object的成员方法,由此可知,二者是有本质区别的。
相同点: 一旦执行方法,都可以使得当前的线程进入等待状态。
不同点:
- 声明的位置不同,sleep()声明在Thread 类,wait()声明在Object 类;
- 关于是否可以指定睡眠时间,sleep函数必须指定,wait可以指定也可以不指定;
- sleep() 会让当前正在运行的、占用CPU时间片的线程挂起指定时间,休眠时间到自动苏醒进入可运行状态;切记,是不会由睡眠状态直接变为运行状态的。wait() 方法用来线程间通信,如果设置了时间,就等待指定时间;如果不设置,则该对象在其它线程被调用 notify() / notifyAll() 方法后进入可运行状态,才有机会竞争获取对象锁。
- 适用场景不同,sleep()可以在任何需要的场景下调用,wait()必须在同步代码块中或者同步方法中的监视器中。
- 关于是否释放同步监视器,如果两方法都是使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁,并进入线程等待池。
- sleep()线程控制自身流程。wait()用来线程间通信,使拥有该对象锁的线程等待直到指定时间或notify()。