sleep()和wait()方法的区别

一、sleep()方法是属于线程类Thread中的一个方法,而wait()方法属于Object。

二、

sleep方法是让线程休眠指定的时间,单位毫秒,让出cpu给其他线程,但它的监控状态依然保持着,指定时间到了自动恢复sleep前的状态。在sleep过程中线程不会释放对象锁。谁调用sleep谁睡眠,在A线程中调用B线程的sleep方法,是A线程去睡眠。

只能从同步块中调用wait()方法,线程会放弃对象锁,让其他线程可以获得对象锁。

如果直接调用 wait 会抛出 java.lang.IllegalMonitorStateException 异常,原因是还没有得到对象锁,所以无法释放锁。

线程wait后要等待其他线程调用 notify 或 notifyAll 对  锁的对象唤醒!

三、sleep方法需要抛异常,wait方法不需要


注意sleep方法是单线程的,没有释放锁,这个锁指的是线程锁,不是对象锁,而wait方法释放锁,这个锁是对象锁,所以sleep时间到和wait等到notify之后享受的待遇一样,都是回到就绪状态,等待系统分配cpu


Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。另外值得一提的是Thread.Sleep(0)的作用,就是触发操作系统立刻重新进行一次CPU竞争,竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。

wait(1000)表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。

---------------------

作者:a4227139

来源:CSDN

原文:https://blog.csdn.net/a4227139/article/details/76644901

版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(sleep()和wait()方法的区别)