黑马程序员技术交流社区
标题:
线程中sleep() 和 wait()
[打印本页]
作者:
小飞龙
时间:
2012-7-19 16:20
标题:
线程中sleep() 和 wait()
线程中sleep() 和 wait() 有什么区别?
作者:
王龙彪
时间:
2012-7-19 16:22
sleep()到了一定的时间后会自动醒来
wait()需要被notify()唤醒哈...
求技术分{:soso_e109:}
作者:
山水游客
时间:
2012-7-19 16:30
sleep()是线程睡眠自动醒来,后面跟时间参数,wait()和notify()一起用,wait()相当于一个对象
的等待池,线程进入后放弃所旗标进入睡眠状态,直到另一个线程调用notify()将在等待池中的第一个等
待线程唤醒
作者:
孙新强
时间:
2012-7-19 16:45
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.
而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线 程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处 继续执行.
作者:
黑马振鹏
时间:
2012-7-19 16:51
sleep(time)是将正在执行的线程转到冻结状态。运行---》冻结。放弃了执行资格。如果time时间到了,那么会由冻结----》阻塞,具备执行资格,但是没有执行权。
wait()相对于sleep是少了时间参数,不会自动唤醒,需要notify()来唤醒,其他两个方法一致。
作者:
陈淑飞
时间:
2012-7-19 17:38
sleep与wait的重要 区别是.
sleep 的应用环境不需要 锁,而wait 必须在同步块、同步方法中或加锁Lock lock = ... lock.lock() 与解锁lock.unlock()之内。
sleep时,释放CPU资源。
但没有释放锁,所以若sleep放在同步锁中,别的线程在这个线程sleep时,是进不来的。
wait时,不仅释放了CPU资源,而且同时释放了对锁的占用。wait之后,只能通过notify或notifyall,重新进行线程预运行状态,重新竞争CPU资源。
作者:
刘俊佳
时间:
2012-7-19 18:19
sleep用于线程控制,wait用于线程间的通信,
sleep是Thread类的方法,是线程用来控制自身流程的,wait是Object类的方法,用来线程间的通信,这个方法会使当前拥有该对象锁的进程等待知道其他线程调用notify方法时再醒来,不过你也可以给他指定一个时间,自动醒来。这个方法主要是用走不同线程之间的调度的
由于wait函数的特殊意义,所以是放在同步语句块中的
作者:
黑马-李勇
时间:
2012-7-19 18:28
wait() |sleep()
属于顶层Object类 |属于Thread类
调用时可解除锁定(把对象锁让给其他线程)|调用时不会解除锁定
可在执行wait()期间调用线程对象中的
其他同步方法 |期间不能调用线程对象中的其他同步方法
wait()执行之后收回对象锁,
(1)wait(X):X毫秒之后唤醒,
(2)通过notify()或notifyAll()唤醒 |sleep(Y):Y毫秒后唤醒
wait,notify和notifyAll只能在同步控制
方法或者同步控制块里面使用 |sleep()可以在任何地方使用
上面是论坛里前辈的
sleep(time):规定时间后自动醒
wait():等待,不自动醒
notify():唤醒等待的进程
作者:
黄锐
时间:
2012-7-19 20:54
sleep和wait的区别有:
1,这两个方法来自不同的类分别是
Thread
和
Object
2,最主要是sleep方法
没有释放锁
,而wait方法
释放了锁
,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在
同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
再给你介绍下:
1.sleep()方法介绍
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非
(a)醒来的线程具有更高的优先级。
(b)正在运行的线程因为其它原因而
阻塞
。
2.wait()方法介绍
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 当调用wait()后,
线程会释放掉它所占有的锁标志
,从而使线程所在对象中的其它synchronized数据可被别的线程使用。
作者:
李菁
时间:
2012-7-19 21:26
Thread.sleep()是当前线程在指定的时间处于“非运行”状态。线程一直持有对象的监视器。sleep()是一个静态方法。这意味着只对当前线程有效,一个非常常见的错误是调用tt.sleep(),这里tt是一个不同于当前线程的线程。即便是直行tt.sleep(),也是当前线程进入睡眠而不是tt线程。
Object.wait()是当前线程处于“不可运行状态”。调用wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用Object.notify(),这样将唤醒原来等待的线程,然后释放该锁。
基本上wait()/notify()与sleep()/interrupt()类似,只是前者需要获取对象锁
作者:
刘笑
时间:
2012-7-19 21:53
C:\Users\Administrator\Desktop\36%5BZ7$DFZ{GL8TO7KAC%G`7.jpg
作者:
陈欢
时间:
2012-7-19 22:04
wait是等待资源 线程处于已激活状态 直到有资源分配给该线程时 该线程继续运行
sleep的线程是非激活状态
作者:
孙浩迪
时间:
2012-7-19 22:31
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该
进程:如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源
,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interupt()
方法而产生。
sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态
不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释
放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。但在sleep的过程中过程中可能被其他对象调用它的
interrupt(),产生interruptedException异常,如果你的程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态
如果你的程序捕获了这个异常,那么程序就会继续执行catch语句块(可能还有finally语句块)以及以后的代码。
注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,
它只会是使当前线程被sleep而不是t线程。
作者:
黄一
时间:
2012-7-19 23:38
学习了。
作者:
陌花╮有意、
时间:
2012-7-19 23:41
wait方法是
Object
l类中的内容
sleep方法是
Thread
类中的内容
并且wait只能用在
同步代码块
中
他们的最大区别在于:
wait
释放资源,释放锁
也就是其他线程可以访问
sleep
释放资源,不释放锁
在sleep时其他线程不可以访问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2