线程相关方法之wait方法
说wait是线程相关方法其实是有点问题的。因为wait()方法实际是属于Object的方法,也就是说所有对象都有wait()方法。与wait()方法相关的,自然就想到了notify和notifyAll(), 同样这二者也隶属与Object,自然也是所有对象都有的。想想还是很有意思的。

下面说说和线程相关的用法。

一个线程调用wait()方法后,会进入等待队列(等待状态)进入这个状态是不能自动唤醒的,必须靠其他线程调用notify方法或者notifyAll()方法才可能被唤醒,之所以说可能,是因为调用notify是随机唤醒一个等待状态的线程,并不能保证唤醒的就是我们需要的线程。所以一般使用notifyAll(),notifyAll()方法会一次性唤醒所有在等待状态的线程,等待状态的线程被唤醒后会进入锁池,等待获得锁标记。这里就是之前说过的线程状态相关的东西了。

上面说到从等待队列出来的线程会进入锁池等待获取锁标记,那么就又引出一点知识:wait()方法的调用会释放掉当前线程持有的所有资源,包括持有的锁。

另外,由于wait()、notify()、notifyAll()方法会对对象的锁标记进行操作,所以这三个方法只能在synchronized函数或者synchronized同步块中使用。否则会抛出IllegalMonitorStateException异常。

此外,wait()方法还有另外两个重载版本:wait(long timeout); wait(long timeout, int nanos)只是对于第二个重载的方法,里面的 nanos 参数的处理仅仅是:
    if (nanos > 0) {
        timeout++;
    }
不太懂 nanos 存在的意义。如果您恰巧知道其中的奥秘,欢迎留言 :)。

可以结合前面几篇博客来看。点击文章下方 多线程 标签即可获取相关笔记列表。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门