关于线程wait方法

今天遇到疑问,为什么如上图的线程不能唤醒wait。于是去CSDN提问和自己查资料,原来我这里只有一个线程,这里应该至少有两个同步的线程。于是我把代码改成这样。

这样,线程0就可以被唤醒。执行完。


那我这里是把线程1延迟了三秒钟,如果不延迟,也能得到线程0唤醒,不过估计你要多刷几遍了。

那这里线程1延迟三秒起到三秒作用了呢?

其实就是在等待线程0走到“我要暂停了...”这一步,让线程0处于执行wait()后的状态--阻塞态。     因为这里循环的次数只有300次,以计算机的计算速度,很多时候在你还没有执行到wait的时候,就循环完300次了。这样,然后它再去wait(),其实这时候线程1已经执行完毕,只剩线程0和main守护线程,线程0也就不能被唤醒了。

这里打印出当前线程是:线程0

之后我又做了这样的试验。

在线程0里去唤醒线程0,你们觉得可以吗?

事实上是可以的。那其实这时候,sleep(3000)就没有什么意义了。但是这里同样需要线程0在线程1执行完之前走到wait方法,那其实这里又引发了一个疑问,这时候线程1都已经完成了,并且notify方法是在线程0里执行的,它是怎么跳转过去的?

所以这里我觉得线程0并不是由线程1唤醒,而且从notify的前缀就能看出来,是我们同步锁的对象。wait()只是把线程0无限阻塞,等待唤醒,等线程1执行完毕,释放对象锁,然后线程0由对象唤醒,由阻塞态-->就绪态-->运行态。     当然这一切都不能少了两个线程,至少需要两个同步的线程。

不知道我的想法对不对。欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值