本帖最后由 yuanjun52306 于 2016-6-20 00:28 编辑
刚才复习的时候感觉这里有点迷糊,就百度了一下,又看了一下冯佳老师的视频和笔记,感觉更迷糊了....
笔记里是这么写的:
wait方法可以传入参数也可以不传入参数,传参数就是在参数的时间结束后等待,不传入参数就是直接等待(这里的等待指的是线程进入阻塞状态)
冯佳老师在视频里是这么说的:
比方说wait(1000); 那就是过了1秒后等待 wait(); 就是直接等待
后面不带参数的我可以理解,就是说必须用notify()或notifyAll()唤醒,否则会一直阻塞
前面带参数的,如果按照视频说的,1秒后等待,那也就是1秒后进入阻塞状态,也必须用notify()或notifyAll()唤醒,否则也会一直陷入阻塞状态
我查了百度和JDK文档,里面说的也是很模糊
JDK文档是这么说的:
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
我在百度里找到这么个问题:
利用Thread. wait( )同步线程,可以设置超时时间吗?
答案是可以. 里面有一个回答是:
wait(n), 参数 0 时无限长 , 负数会抛 java.lang.IllegalArgumentException 异常 . 等待 n 毫秒,一旦时间到了 , 就自动进入就绪队列
这句话我的理解是: 比方说wait(1000); 那就是过了1秒后,自动进入就绪状态(并非阻塞状态),和sleep(1000)的效果是一样的(这里不考虑锁的释放问题,只考虑时间到后线程的状态问题)
如果这种说法是对的,那么可以理解为wait()里传入的参数是超时时间,超过这个时间,线程就会自动进入就绪队列,等待cpu分配执行权,并不需要notify()或notifyAll()唤醒,这就和视频和笔记上说的矛盾了.
我也在eclipse里面测试过了,wait(1000)和sleep(1000)都放在同步代码块里,效果一样.
希望懂的哥们进来说一下
|
|