A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Say丶懒羊羊 中级黑马   /  2015-5-20 15:46  /  507 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在多线程中,sleep(), wait(),yield(),都是睡眠的方法,但是他们有什么区别啊, 哪种方法更常用.

评分

参与人数 1黑马币 +10 收起 理由
汪汪 + 10 赞一个!

查看全部评分

11 个回复

倒序浏览
wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法。

(1)、常用的wait方法有wait()和wait(long timeout);

        void wait() 在其他线程调用此对象的 notify() 方法或者 notifyAll()方法前,导致当前线程等待。

        void wait(long timeout)在其他线程调用此对象的notify() 方法 或者 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。

        wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其他shnchronized数据可被别的线程使用。


        wait()h和notify()因为会对对象的“锁标志”进行操作,所以他们必需在Synchronized函数或者 synchronized block 中进行调用。如果在non-synchronized 函数或 non-synchronized block 中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。。


(2)、Thread.sleep(long millis)必须带有一个时间参数。

        sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;

        sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级的线程有执行的机会;

        sleep(long)是不会释放锁标志的。


(3)、yield()没有参数

        sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。

        yield()也不会释放锁标志。

        实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。


        sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。


        yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同优先级的线程有执行的机会。
回复 使用道具 举报 2 0
还没有学到那里,来看热闹;
回复 使用道具 举报
2L的回答好详细,    差不多就是这个意思.   这个问题我也遇到过,当时也想问的
回复 使用道具 举报
sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;

        sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级的线程有执行的机会;

        sleep(long)是不会释放锁标志的。
回复 使用道具 举报
学习中,:)
回复 使用道具 举报
sleep():睡眠指定时间,当时间到后,自动醒来,注:在sleep()期间不释放锁;
wait():object的方法,由notify或者notifyall唤醒,也可指定时间自动醒来,在wait()期间自动释放锁;
yield():thread的方法,退回到就绪状态,等待,系统重新分配,在yield()期间不释放锁
回复 使用道具 举报
gaoer 中级黑马 2015-5-20 23:00:54
8#
看都看不懂啊~~~~~~~!
回复 使用道具 举报
目前真是不懂,涨涨见识
回复 使用道具 举报
2L很详细呀!学习了
回复 使用道具 举报
二楼解答真好啊,赞一个
回复 使用道具 举报
本来想进来回复一下,看到2L的回答,感觉自己的答案拿不出手啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马