• 暑期JAVA学习(35)线程通信


    一、什么是线程通信、如何实现?

    ●所谓线程通信就是线程间相互发送数据,线程间共享一个资源即可实现线程通信。

    二、线程通信常见形式

    ●通过共享一个数据的方式实现。

    ●根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。

    三、线程通信实际应用场景

    ●生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费生产者产生的数据。

    ●要求:生产者线程生产完数据后唤醒消费者,然后等待自己,消费者消费完该数据后唤醒生产者,然后等待自己。

    四、线程通信的三个常见方法

    方法名称说明
    void wait​()当前线程等待,直到另一个线程调用notify() 或 notifyAll()唤醒自己
    void notify​()唤醒正在等待对象监视器(锁对象)的单个线程
    void notifyAll​()唤醒正在等待对象监视器(锁对象)的所有线程

    注意
    ●上述方法应该使用当前同步锁对象进行调用。

    五、线程通信案例模拟

    ●模拟客服系统,系统可以不断的接入电话和分发给客服

    ●线程通信的前提:线程通信通常是在多个线程操作同一个共享资源的时候需要进行通信,且要保证线程安全。

    六、具体实现

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    /**
     目标:模拟线程通信,来电提醒,线程接电话线程了解思想即可,代码并不重要)
     */
    public class Phone {
        //实现线程间通信: 默认认为手机当前处于等待来电提醒
        private boolean flag = false;
    
        public void run(){
            //a.负责来电提醒的线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //把手机对象作为锁 Phone.this
                    try {
                        while (true) {
                            synchronized (Phone.this){
                                if (!flag){
                                    //代表需要来电提醒
                                    System.out.println("您好,有电话呼入,请接听!");
                                    flag = true;
                                    //唤醒别人,等待自己
                                    Phone.this.notify();
                                    Phone.this.wait();
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
    
            //b.接电话线程,正式接听
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //不断地接听电话
                        while (true){
                            //把手机对象作为锁 Phone.this
                            synchronized (Phone.this){
                                if (flag){
                                    //可以接听电话
                                    System.out.println("电话接听中~通话五分钟后结束啦!");
                                    Thread.sleep(5000);
                                    flag = false;//代表要继续等待呼入电话
                                    //唤醒别人,等待自己
                                    Phone.this.notify();
                                    Phone.this.wait();
                                }else {
                                    //唤醒别人,等待自己
                                    Phone.this.notify();
                                    Phone.this.wait();
                                }
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        public static void main(String[] args) {
            ///1.创建一个手机对象
            Phone huawei = new Phone();
            huawei.run();//开机啦
        }
    }
    
    • 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
  • 相关阅读:
    ansible copy 模块
    Defocus(散焦)
    vue3中手写组合API shallowReactive 与 reactive
    SuMa SuMa++
    Windows OpenGL 图像阴影
    MYSQL介绍——数据库查询
    愚蠢的代码?某程序员强行编写了一段开发阶段无法调试的代码,大佬们快来救救他!
    基于ASP.NET大学生校园招聘网站的设计与开发
    不同类型跨链桥中可能存在的安全隐患
    T1024:保留3位小数的浮点数(信息学一本通C++)
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126076538