关于线程wait方法

来源:互联网 发布:制作明信片的软件 编辑:程序博客网 时间:2024/06/05 00:12

今天遇到疑问,为什么如上图的线程不能唤醒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由对象唤醒,由阻塞态-->就绪态-->运行态。     当然这一切都不能少了两个线程,至少需要两个同步的线程。

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

0 0
原创粉丝点击