多线程中wait和notify的特性

Posted IT编程之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程中wait和notify的特性相关的知识,希望对你有一定的参考价值。

当线程呈wait()状态时,调用线程的对象的interrupt()方法会出现InterruptedException异常。我们创建项目测试一下代码如下:

服务类TestWaitService.java

线程类TestThread.java

多线程中wait和notify的特性

测试类TestRun.java

多线程中wait和notify的特性

运行结果:

多线程中wait和notify的特性

通过实验可以得出一下几点结论:

1)执行完同步代码块就会释放对象锁。

2)在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放。

3)在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,而线程对象会进入线程等待池中,等待被唤醒。

调用方法notify()一次只随机通知一个线程进行唤醒,我们创建程序测试一下,代码入下:

服务类TestNotifyService.java

多线程中wait和notify的特性

3个自定义线程Thread_A.java、Thread_B.java、Thread_C.java

多线程中wait和notify的特性

多线程中wait和notify的特性

多线程中wait和notify的特性

唤醒线程TestNotifyThread.java

多线程中wait和notify的特性

运行类NotifyTest.java

多线程中wait和notify的特性

运行结果:

多线程中wait和notify的特性

由结果看出notify()仅随机唤醒一个线程,当多次调用notify()方法时,会随机将等待wait状态的线程进行唤醒。修改TestNotifyThread.java类代码如下:

多线程中wait和notify的特性

运行结果:

多线程中wait和notify的特性

线程被完全唤醒,多次调用notify方法唤醒全部wait状态的线程。

通过多次调用notify()方法来实现唤醒wait()状态的线程是有缺陷的,我们不能保证线程中的数量,如果notify()方法的调用次数少于线程对象的数量,会出现部分线程无法被唤醒的情况,为了唤醒所有的线程,我们可以使用notifyAll()方法。

继续修改TestNotifyThread.java类,代码如下:

多线程中wait和notify的特性

运行结果:

结果来看所有的线程都被唤醒了。


大家在学习过程中遇到过什么问题也欢迎在留言区盖楼讨论!

更多精彩推荐,请关注我们



以上是关于多线程中wait和notify的特性的主要内容,如果未能解决你的问题,请参考以下文章

多线程线程安全问题

多线程线程安全问题

多线程-wait/notify/notifyAll

JAVA多线程suspend,resume和wait,notify的区别

多线程通信wait/notify

[多线程]wait和notify