• 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 的具体实现。

     

  • 相关阅读:
    【设计模式】策略模式
    循环练习
    web中间件漏洞-weblogic漏洞-弱口令war包上传
    Hbase API
    Linux 常用命令
    Vue3 按需引入 Element Plus
    java计算机毕业设计汽车美容管理源码+mysql数据库+系统+lw文档+部署
    Javas | DecimalFormat类、BigDecimal类、Random类
    系统编程:互斥锁,条件变量
    瑞吉外卖优化
  • 原文地址:https://blog.csdn.net/zp357252539/article/details/125471901