您的位置:首页 > 编程语言 > Java开发

java中sleep()和wait()的区别

2017-04-17 10:37 288 查看
这两个方法主要来源是,sleep用于线程控制,而wait用于线程间的通信,与wait配套的方法还有notify和notifyAll.

区别一:

sleep是Thread类的方法,是线程用来控制自身流程的,比如有一个要报时的线程,每一秒中打印出一个时间,那么我就需要在print方法前面加上一个sleep让自己每隔一秒执行一次。就像个闹钟一样。通常我们在写demo的时候,用sleep()方法,通常是为了试验看等待后有没有线程 去执行或者起一个定时的作用。

wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待,直到其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的。

区别二 :

关于锁的释放 ,在这里假设大家已经知道了锁的概念及其意义。调用sleep方法不会释放锁。所以我个人认为sleep与锁无关,反正当前线程调用sleep就是想休息,是在管理自己,你别的线程能不能运行,不是看我,而是看是否有锁。可以这样解释:sleep()就是程序暂停下来去休息,如果没有加锁,那么这个线程休息,别的线程当然可以去执行了,就是没有sleep,运行着的线程也会被别的线程抢去执行,所以从不加锁的角度去说,sleep与线程通信是没有关系的;如果加了锁,当前线程调用sleep停下来休息了,但是还是在Lock或者synchronized中,锁没有被释放掉,所以别的线程没有办法持有锁,还是没有办法执行的,这也能说明sleep与通信没有关系,关键在于锁是否释放。

JDK 7 中的解释:

public static void sleep(long millis)
throws InterruptedException
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.The thread does not lose ownership of any monitors.

public final void wait() throws InterruptedException
Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words,  this method behaves exactly as if it simply performs the call wait(0).The current thread must own this object's monitor. The thread releases ownership of this monitor and    waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method  the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.


调用wait方法会释放当前线程的锁(其实线程间的通信是靠对象来管理的,所有操作一个对象的线程是这个对象通过自己的wait方法来管理的,就好像这个对象是电视机,三个人是三个线程,那么电视机的遥控器就是这个锁,假如现在A拿着遥控器,电视机调用wait方法,那么A就交出自己的遥控器,由jVM虚拟机调度,遥控器该交给谁。)【我想到一个好玩的例子:如果A拿遥控器的期间,他可以用自己的sleep每隔十分钟调一次电视台,而在他调台休息的十分钟期间,遥控器还在他的手上~】


区别三:

使用区域

由于wait函数的特殊意义,所以他是应该放在同步语句块中的,让锁对象去调用wait方法,放弃当前的线程的执行权,直到该对象用notify唤醒他。这样才有意义 。

注意:两个方法都需要抛出异常
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: