• 构建Java线程间的默契:学习wait()、notify()和notifyAll()方法的巧妙运用


    哈喽,各位小伙伴们,你们好呀,我是喵手。

      今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

      我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

    小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

    前言

      在Java多线程编程中,线程间的同步和通信是非常重要的。本文将帮助读者学习wait()、notify()和notifyAll()方法的巧妙运用,实现线程间的默契配合,构建高效的多线程应用。

    摘要

      本文将全面解析wait()、notify()和notifyAll()方法在Java中的使用。通过深入源代码解析、实际应用场景案例、优缺点分析、类代码方法介绍和具体的Java代码测试用例,帮助读者全面掌握线程间的默契配合。

    简介

      在线程间实现默契配合是多线程编程中的关键问题。在本节中,我们将简要介绍线程间的同步和通信的重要性,并预览wait()、notify()和notifyAll()方法的作用。

    源代码解析

      通过源代码解析,我们将深入研究wait()、notify()和notifyAll()方法在Java中的具体实现。了解这些方法的工作原理和应用场景,从而在实际开发中灵活运用。

    应用场景案例

      本节将提供一些实际应用场景的案例,展示wait()、notify()和notifyAll()方法在线程间通信中的应用。通过案例的介绍,读者将更好地理解这些方法的实际应用和潜在优势。

    优缺点分析

      在本节中,我们将分析wait()、notify()和notifyAll()方法的优点和缺点。我们将讨论使用这些方法带来的性能开销、死锁和竞态条件等方面的考虑。

    类代码方法介绍

      本节将详细介绍Java中与线程间通信相关的类和方法,包括wait()、notify()和notifyAll()方法的使用。通过深入了解这些方法的用法和特性,读者将更好地理解线程间通信的核心机制。

    具体的Java代码测试用例

      为了验证wait()、notify()和notifyAll()方法的正确性和可靠性,我们将编写具体的Java代码测试用例。我们将模拟多线程间的通信场景,观察这些方法的行为和效果。

    // 具体的测试用例代码示例
    
    package com.example.javase.ms.threadDemo;
    
    /**
     * @Author ms
     * @Date 2023-12-16 18:05
     */
    public class ThreadCommunicationExample {
        public static void main(String[] args) {
            Message message = new Message();
            Thread sender = new SenderThread(message);
            Thread receiver = new ReceiverThread(message);
            sender.start();
            receiver.start();
        }
    
        // 消息类
        static class Message {
            private String content;
            private boolean isNewMessage = false;
    
            public synchronized void send(String msg) {
                while (isNewMessage) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                content = msg;
                isNewMessage = true;
                notifyAll();
            }
    
            public synchronized String receive() {
                while (!isNewMessage) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                isNewMessage = false;
                notifyAll();
                return content;
            }
        }
    
        // 发送线程
        static class SenderThread extends Thread {
            private Message message;
    
            public SenderThread(Message message) {
                this.message = message;
            }
    
            @Override
            public void run() {
                String[] messages = {"Hello", "World", "Java"};
                for (String msg : messages) {
                    message.send(msg);
                }
            }
        }
    
        // 接收线程
        static class ReceiverThread extends Thread {
            private Message message;
    
            public ReceiverThread(Message message) {
                this.message = message;
            }
    
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    String msg = message.receive();
                    System.out.println("Received: " + msg);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    测试结果展示:

    根据如上测试用例,我本地执行结果如下:

    image.png

    代码解析:

      如下针对上述测试代码,给大家具体讲解下,仅供参考:

      如上段代码演示了线程之间的通信。代码中定义了一个消息类Message,其中包含了send()和receive()方法,用于发送和接收消息。这两个方法都使用了synchronized关键字,确保在多线程环境下的同步操作。

      在发送线程SenderThread中,通过循环向消息对象发送三条消息。发送时,如果消息对象中已经有新消息,则发送线程进入等待状态,直到接收线程接收完毕并通知发送线程后再发送新消息。

      在接收线程ReceiverThread中,通过循环接收三条消息。接收时,如果消息对象中没有新消息,则接收线程进入等待状态,直到发送线程发送新消息后再进行接收。接收完一条消息后,打印接收到的内容。

      在主函数中,创建了一个消息对象,并分别创建了发送线程和接收线程,并启动这两个线程。

      运行该代码,可以看到发送线程先发送消息,接收线程接收消息,并顺序打印出来。线程之间通过共享的消息对象进行通信,通过wait()和notifyAll()方法进行同步操作,确保消息的正确发送和接收。

    全文小结

      在本节中,我们对全文的内容进行小结,强调wait()、notify()和notifyAll()方法在Java多线程编程中的关键作用和使用要点。

    总结

      通过本文的学习,我们深入了解了wait()、notify()和notifyAll()方法的巧妙运用。掌握线程间同步与通信的默契配合,对于实现高效、可靠的多线程应用程序至关重要。我们鼓励读者深入学习和实践这些方法,灵活运用于多线程编程中。

      希望本文能帮助读者全面理解和掌握wait()、notify()和notifyAll()方法的巧妙运用,提升Java多线程编程的技能和水平。通过合理使用这些方法,我们能够构建出高效、可靠的并发应用程序,充分发挥多核处理器的性能。

    … …

    文末

    好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

    … …

    学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

    wished for you successed !!!


    ⭐️若喜欢我,就请关注我叭。

    ⭐️若对您有用,就请点赞叭。

    ⭐️若有疑问,就请评论留言告诉我叭。

  • 相关阅读:
    SpringMvc---编码过滤器(解决乱码问题)
    java EE初阶 — synchronized 关键字 - 监视器锁 monitor lock
    Three.js——骨骼动画
    vue+antd——实现table表格的打印——分页换行,每页都有表头——基础积累
    类与对象(二)
    工业机器人多物料双姿态循环搬运工艺集成
    Papers with Code一个查找论文和对应代码的神器
    CentOs7搭建基于pptp的VPN服务器
    操作系统——快速复习笔记01
    java Netty通信例子
  • 原文地址:https://blog.csdn.net/weixin_66592566/article/details/136818483