黑马程序员技术交流社区

标题: 有没有大神啊! 急求问题. [打印本页]

作者: Say丶懒羊羊    时间: 2015-5-20 15:46
标题: 有没有大神啊! 急求问题.
在多线程中,sleep(), wait(),yield(),都是睡眠的方法,但是他们有什么区别啊, 哪种方法更常用.
作者: 开到荼靡    时间: 2015-5-20 15:49
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()方法只能使同优先级的线程有执行的机会。
作者: 冷雨敲窗被未温    时间: 2015-5-20 16:32
还没有学到那里,来看热闹;
作者: 汪汪    时间: 2015-5-20 16:37
2L的回答好详细,    差不多就是这个意思.   这个问题我也遇到过,当时也想问的
作者: 彭越    时间: 2015-5-20 16:54
sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;

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

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

作者: mars_b0ZZ0    时间: 2015-5-20 17:05
学习中,:)
作者: zlp19940327    时间: 2015-5-20 22:42
sleep():睡眠指定时间,当时间到后,自动醒来,注:在sleep()期间不释放锁;
wait():object的方法,由notify或者notifyall唤醒,也可指定时间自动醒来,在wait()期间自动释放锁;
yield():thread的方法,退回到就绪状态,等待,系统重新分配,在yield()期间不释放锁
作者: gaoer    时间: 2015-5-20 23:00
看都看不懂啊~~~~~~~!
作者: jiatengde    时间: 2015-5-21 00:06
目前真是不懂,涨涨见识
作者: 刘冬    时间: 2015-5-21 09:42
2L很详细呀!学习了
作者: 王建伟    时间: 2015-5-21 09:44
二楼解答真好啊,赞一个
作者: 凉仁日记    时间: 2015-5-21 21:14
本来想进来回复一下,看到2L的回答,感觉自己的答案拿不出手啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2