零基础java自学流程-Java语言高级393

559 篇文章 0 订阅
546 篇文章 0 订阅

1、wait()

<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-java"><span style="color:#0077aa">public</span> <span style="color:#0077aa">final</span> <span style="color:#0077aa">void</span> <span style="color:#dd4a68">wait</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#0077aa">throws</span> <span style="color:#dd4a68">InterruptedException</span> <span style="color:#999999">,</span> <span style="color:#dd4a68">IllegalMonitorStateException</span>
</code></span></span>

该方法用来将当前线程置入休眠(阻塞)状态,直到接到通知或被中断为止。在调用wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。进入wait()方法后,当前线程释放锁。在从wait()返回前,线程与其他线程竞争重新获得锁。如果调用wait()时,没有持有适当的锁,则抛出IllegalMonitorStateException。

2、notify()

<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-java"><span style="color:#0077aa">public</span> <span style="color:#0077aa">final</span> <span style="color:#0077aa">native</span> <span style="color:#0077aa">void</span> <span style="color:#dd4a68">notify</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#0077aa">throws</span> <span style="color:#dd4a68">IllegalMonitorStateException</span>
</code></span></span>

该方法也要在同步方法或同步块中调用,即在调用前,线程也必须要获得该对象的对象级别锁,如果调用notify()时没有持有适当的锁,也会抛出IllegalMonitorStateException。

该方法用来通知那些可能等待该对象的对象锁的其他线程。如果有多个线程等待,则线程规划器任意挑选出其中一个wait()状态的线程来发出通知,并使它等待获取该对象的对象锁,但不惊动其他同样在等待被该对象notify的线程们。当第一个获得了该对象锁的wait线程运行完毕以后,它会释放掉该对象锁,此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,会继续阻塞在wait状态,直到这个对象发出一个notify或notifyAll。这里需要注意:它们等待的是被notify或notifyAll,而不是锁。这与下面的notifyAll()方法执行后的情况不同。

特别注意:当在同步中调用wait()方法时,执行该代码的线程会立即放弃它在对象上的锁。然而在调用notify()时,并不意味着这时线程会放弃该对象锁,而是要等到程序运行完synchronized代码块后,当前线程才会释放锁,wait所在的线程也才可以获取该对象锁。

3、notifyAll()

<span style="background-color:#f5f2f0"><span style="color:black"><code class="language-java"><span style="color:#0077aa">public</span> <span style="color:#0077aa">final</span> <span style="color:#0077aa">native</span> <span style="color:#0077aa">void</span> <span style="color:#dd4a68">notifyAll</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#0077aa">throws</span> <span style="color:#dd4a68">IllegalMonitorStateException</span>
</code></span></span>

该方法与notify()方法的工作方式相同,重要的一点差异是:

notifyAll使所有原来在该对象上wait的线程统统退出wait的状态(即全部被唤醒,不再等待notify或notifyAll,但由于此时还没有获取到该对象锁,因此还不能继续往下执行),变成等待获取该对象上的锁,一旦该对象锁被释放(notifyAll线程退出调用了notifyAll的synchronized代码块的时候),他们就会去竞争。如果其中一个线程获得了该对象锁,它就会继续往下执行,在它退出synchronized代码块,释放锁后,其它的已经被唤醒的线程将会继续竞争获取该锁,一直进行下去,直到所有被唤醒的线程都执行完毕。


尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili尚学堂给同学们带来全新的Java300集课程啦本课程为Java300集2022版第一季,配合最新版的Java课程,所有视频重新录制,课件所有图形做了重新绘制和配色,图解学习Java,让学习成为一种享受本套教程专门为零基础学员而制,适合准备入行Java开发的零基础学员,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。后续课https://www.bilibili.com/video/BV1qL411u7eE?spm_id_from=333.999.0.0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值