黑马程序员技术交流社区
标题:
wait和sleep都有哪些区别呀?希望能具体点
[打印本页]
作者:
战马
时间:
2013-10-26 22:20
标题:
wait和sleep都有哪些区别呀?希望能具体点
wait和sleep都有哪些区别呀?希望能具体点
作者:
近夜之星
时间:
2013-10-26 22:41
sleep()方法和wait()方法都成产生让当前运行的线程停止运行的效果,这是它们的共同点。下面我们来详细说说它们的不同之处。
sleep()方法是本地方法,属于Thread类,它有两种定义:
[java] view plaincopyprint?
01.public static native void sleep(long millis) throws InterruptedException;
02.public static void sleep(long millis, int nanos) throws InterruptedException {
03. //other code
04.}
复制代码
其中的参数millis代表毫秒数(千分之一秒),nanos代表纳秒数(十亿分之一秒)。这两个方法都可以让调用它的线程沉睡(停止运行)指定的时间,到了这个时间,线程就会自动醒来,变为可运行状态(RUNNABLE),但这并不表示它马上就会被运行,因为线程调度机制恢复线程的运行也需要时间。调用sleep()方法并不会让线程释放它所持有的同步锁;而且在这期间它也不会阻碍其它线程的运行。上面的连个方法都声明抛出一个InterruptedException类型的异常,这是因为线程在sleep()期间,有可能被持有它的引用的其它线程调用它的interrupt()方法而中断。中断一个线程会导致一个InterruptedException异常的产生,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态,如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
为了更好地理解interrupt()效果,我们来看一下下面这个例子:
[java] view plaincopyprint?
01.public class InterruptTest {
02. public static void main(String[] args) {
03. Thread t = new Thread() {
04. public void run() {
05. try {
06. System.out.println("我被执行了-在sleep()方法前");
07. // 停止运行10分钟
08. Thread.sleep(1000 * 60 * 60 * 10);
09. System.out.println("我被执行了-在sleep()方法后");
10. } catch (InterruptedException e) {
11. System.out.println("我被执行了-在catch语句块中");
12. }
13. System.out.println("我被执行了-在try{}语句块后");
14. }
15. };
16. // 启动线程
17. t.start();
18. // 在sleep()结束前中断它
19. t.interrupt();
20. }
21.}
复制代码
运行结果:
我被执行了-在sleep()方法前
我被执行了-在catch语句块中
我被执行了-在try{}语句块后
wait()方法也是本地方法,属于Object类,有三个定义:
[java] view plaincopyprint?
01.public final void wait() throws InterruptedException {
02. //do something
03.}
04.public final native void wait(long timeout) throws InterruptedException;
05.public final void wait(long timeout, int nanos) throws InterruptedException {
06. //do something
07.}
复制代码
wari()和wait(long timeout,int nanos)方法都是基于wait(long timeout)方法实现的。同样地,timeout代表毫秒数,nanos代表纳秒数。当调用了某个对象的wait()方法时,当前运行的线程就会转入等待状态(WAITING),等待别的线程再次调用这个对象的notify()或者notifyAll()方法(这两个方法也是本地方法)唤醒它,或者到了指定的最大等待时间,线程自动醒来。如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法同样会被Thread类的interrupt()方法中断,并产生一个InterruptedException异常,效果同sleep()方法被中断一样。
作者:
i'm_fine_
时间:
2013-10-26 22:46
1,wait不用指定参数,sleep需要制定参数。2,当线程调用了wait方法时,线程会处于等待状态,需要另一条线程notify或notifall。3,当线程遇到sleep方法,不释放锁,继续持有锁。
作者:
完美恋爱
时间:
2013-10-26 23:08
sleep()和wait()的区别:
(1)这两个方法来自不同的类,sleep()来自Thread类,和wait()来自Object类。
(2)sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,
要让b线程睡觉要在b的代码中调用sleep。而wait()是Object类的非静态方法
(3)sleep()释放资源不释放锁,而wait()释放资源释放锁;
(4)使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
作者:
起猿
时间:
2013-10-27 00:13
sleep是线程被调用时,占着cpu去睡觉,其他线程不能占用cpu,os认为该线程正在工作,不会让出系统资源,wait是进入等待池等待,让出系统资源,其他线程可以占用cpu,一般wait不会加时间限制,因为如果wait的线程运行资源不够,再出来也没用,要等待其他线程调用notifyall方法唤醒等待池中的所有线程,才会在进入就绪序列等待os分配系统资源,
sleep是静态方法,是谁掉的谁去睡觉,就算是在main线程里调用了线程b的sleep方法,实际上还是main去睡觉,想让线程b去睡觉要在b的代码中掉sleep
sleep(100L)是占用cpu,线程休眠100毫秒,其他进程不能再占用cpu资源,wait(100L)是进入等待池中等待,交出cpu等系统资源供其他进程使用,在这100毫秒中,该线程可以被其他线程notify,但不同的是其他在等待池中的线程不被notify不会出来,但这个线程在等待100毫秒后会自动进入就绪队列等待系统分配资源,换句话说,sleep(100)在100毫秒后肯定会运行,但wait在100毫秒后还有等待os调用分配资源,所以wait100的停止运行时间是不确定的,但至少是100毫秒。
作者:
To
时间:
2013-10-27 16:23
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:
http://bbs.itheima.com/thread-89313-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2