多线程中wait和notify的特性
Posted IT编程之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程中wait和notify的特性相关的知识,希望对你有一定的参考价值。
当线程呈wait()状态时,调用线程的对象的interrupt()方法会出现InterruptedException异常。我们创建项目测试一下代码如下:
服务类TestWaitService.java
线程类TestThread.java
测试类TestRun.java
运行结果:
通过实验可以得出一下几点结论:
1)执行完同步代码块就会释放对象锁。
2)在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。
3)在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,而线程对象会进入线程等待池中,等待被唤醒。
调用方法notify()一次只随机通知一个线程进行唤醒,我们创建程序测试一下,代码入下:
服务类TestNotifyService.java
3个自定义线程Thread_A.java、Thread_B.java、Thread_C.java
唤醒线程TestNotifyThread.java
运行类NotifyTest.java
运行结果:
由结果看出notify()仅随机唤醒一个线程,当多次调用notify()方法时,会随机将等待wait状态的线程进行唤醒。修改TestNotifyThread.java类代码如下:
运行结果:
线程被完全唤醒,多次调用notify方法唤醒全部wait状态的线程。
通过多次调用notify()方法来实现唤醒wait()状态的线程是有缺陷的,我们不能保证线程中的数量,如果notify()方法的调用次数少于线程对象的数量,会出现部分线程无法被唤醒的情况,为了唤醒所有的线程,我们可以使用notifyAll()方法。
继续修改TestNotifyThread.java类,代码如下:
运行结果:
结果来看所有的线程都被唤醒了。
大家在学习过程中遇到过什么问题也欢迎在留言区盖楼讨论!
以上是关于多线程中wait和notify的特性的主要内容,如果未能解决你的问题,请参考以下文章