• java 多线程& notifyAll()方法:通知所有线程——73


            前面示例通过多次调用notify() 方法实现 5个线程被唤醒,但并不能保证系统中仅有 5个线程,也就是notify()方法的调用次数小于线程对象的数量,那么会出现部分线程对象没有被唤醒的情况。为了唤醒全部线程可以使用notifyAll() 方法。

    注意 

            notifyAll()方法会按照执行 wait()方法的倒序依次对其他线程进行唤醒。

     类MyService.java代码

    1. package chapter3.test3_1.test3_1_14;
    2. public class MyService {
    3. private Object lock = new Object();
    4. public void waitMethod() {
    5. try {
    6. synchronized (lock) {
    7. System.out.println("begin wait " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
    8. lock.wait();
    9. System.out.println(" end wait " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
    10. }
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. public void notifyMethod() {
    16. synchronized (lock) {
    17. System.out.println("begin notify " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
    18. lock.notifyAll();
    19. System.out.println(" end notify " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
    20. }
    21. }
    22. }

    执行wait()方法的线程MyThreadA.java源代码

    1. package chapter3.test3_1.test3_1_13;
    2. public class MyThreadA extends Thread {
    3. private MyService service;
    4. public MyThreadA(MyService service) {
    5. super();
    6. this.service = service;
    7. }
    8. @Override
    9. public void run() {
    10. service.waitMethod();
    11. }
    12. }

    创建唤醒线程MyThreadB.java

    1. package chapter3.test3_1.test3_1_13;
    2. public class MyThreadB extends Thread {
    3. private MyService service;
    4. public MyThreadB(MyService service) {
    5. super();
    6. this.service = service;
    7. }
    8. @Override
    9. public void run() {
    10. service.notifyMethod();
    11. }
    12. }

    Test.java代码

    1. package chapter3.test3_1.test3_1_14;
    2. public class Test {
    3. public static void main(String[] args) throws InterruptedException {
    4. MyService service = new MyService();
    5. for (int i = 0; i < 10; i++) {
    6. MyThreadA t1 = new MyThreadA(service);
    7. t1.start();
    8. }
    9. Thread.sleep(1000);
    10. MyThreadB t1 = new MyThreadB(service);
    11. t1.start();
    12. }
    13. }

     程序运行结果

            唤醒的顺序是正序、倒序、随机,取决于具体的JVM实现,不是所有的JVM 在执行 notify() 时都是按调用wait()方法的正序进行唤醒的,也不是所有的 JVM在执行notifyAll() 时都是按调用 wait()方法的倒序进行唤醒的,具 体的唤醒顺序依赖于 JVM 的具体实现。

     

  • 相关阅读:
    如何澄清“一句话需求”?
    仿函数的学习
    什么是冲突域,什么是广播域?区别又是什么
    Maven多环境下 active: @profileActive@报错问题解决
    【3dmax】怎么将点删除而面保留
    DirectX12初始化三——DirectX图形基础结构,功能支持检测,资源驻留
    pip工具的使用:基本+高级用法
    根据WebService接口地址获取接口定义文件(wsdl文件)
    Vue系列之事件绑定
    【开题报告】基于SpringBoot的有机农产品购物商城的设计与实现
  • 原文地址:https://blog.csdn.net/zp357252539/article/details/125471901