ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Object类中wait带餐方法和notifyAll方法,线程间通信

2022-07-08 14:33:39  阅读:130  来源: 互联网

标签:带餐 obj notifyAll 间通信 线程 println 唤醒 包子 wait


Object类中wait带餐方法和notifyAll方法:

进入到Timewaiting (计时等待)有两种方式:

1.使用sLeep(Long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/BLocked状态

2.使用wait(Long m)方法, wait方法如果在瓷秒值结束之后,还没有被not ify唤醒,就会自动醒来,线程睡醒进入到Runmable/Blocked状态

唤醒的方法:

void notify()唤醒在此对象监视器上等待的单个线程。

void notifyALL()唤醒在此对象监视器上等待的所有线程。

public static void main(String[] args) {
    // 创建锁对象,保证唯一
    Object obj = new Object();

    // 创建一个顾客线程
    // 使用匿名内部类,这样就不用写继承父类的子类,或实现接口的实现类
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 保证等待和唤醒只能有一个在执行
            // 所以需要使用同步代码块
            while (true) { // 死循环
                synchronized (obj) {
                    // 告知老板需要的包子种类和数量
                    System.out.println("顾客1告知老板需要的包子种类和数量");
                    // 调用监视器锁的wait方法,进入waiting状态
                    try { // 捕捉异常
                        // 5000毫秒之后,无notify唤醒,自动醒
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 唤醒之后的操作
                    System.out.println("包子做好了,顾客1开吃!");
                    System.out.println("------------");
                }
            }
        }
    }).start(); // 执行

    // 创建第二个顾客线程
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 保证等待和唤醒只能有一个在执行
            // 所以需要使用同步代码块
            while (true) { // 死循环
                synchronized (obj) {
                    // 告知老板需要的包子种类和数量
                    System.out.println("顾客2告知老板需要的包子种类和数量");
                    // 调用监视器锁的wait方法,进入waiting状态
                    try { // 捕捉异常
                        // 5000毫秒之后,无notify唤醒,自动醒
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 唤醒之后的操作
                    System.out.println("包子做好了,顾客2开吃!");
                    System.out.println("------------");
                }
            }
        }
    }).start(); // 执行

    // 创建一个老板线程(生产者)
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 同步代码块
            while (true) {
                // 唤醒顾客,吃包子
                try {
                    // 花5秒做包子
                    Thread.sleep(5000L); // long型
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj) {
                    System.out.println("5秒到了。包子做好了!");
                    obj.notify(); // 如果有多个线程在等待,随机唤醒一个
                    obj.notifyAll(); // 唤醒所有等待线程,方便同步!
                }
            }
        }
    }).start();
}

 

 

 

 

 

线程间通信:

概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。

比如∶线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个

是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。

 

 为什么要处理线程间的通信:

多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们

希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

如何保证线程间通信有效利用资源:

多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。

就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能

有效的利用资源。而这种手段即――等待唤醒机制。

 

搜索

复制

标签:带餐,obj,notifyAll,间通信,线程,println,唤醒,包子,wait
来源: https://www.cnblogs.com/hungui/p/16458157.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有