java线程与cpu线程_坑惨了什么意思

java线程与cpu线程_坑惨了什么意思在java中,线程间的通信可以使用wait、notify、notifyAll来进行控制。从名字就可以看出来这3个方法都是跟多线程相关的,但是可能让你感到吃惊的是:这3个方法并不是Thread类或者是Runnable接口的方法,而是Object类的3个本地方法。下图是我总结的Java资料,想要资料的话请点795983544暗号CSDN。其实要理解这一点也并不难,调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在java中,线程间的通信可以使用wait、notify、notifyAll来进行控制。从名字就可以看出来这3个方法都是跟多线程相关的,但是可能让你感到吃惊的是:这3个方法并不是Thread类或者是Runnable接口的方法,而是Object类的3个本地方法。
在这里插入图片描述

下图是我总结的Java资料,想要资料的话请点795983544暗号CSDN。

在这里插入图片描述

其实要理解这一点也并不难,调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等同于synchronized(obj){…}的内部才能够去调用obj的wait与notify/notifyAll三个方法,否则就会报错:

  java.lang.IllegalMonitorStateException:current thread not owner

也就是说,在调用这3个方法的时候,当前线程必须获得这个对象的锁,那么这3个方法就是和对象锁相关的,所以是属于Object的方法而不是Thread,因为不是每个对象都是Thread。所以我们在理解wait、notify、notifyAll之前,先要了解以下对象锁。

多个线程都持有同一个对象的时候,如果都要进入synchronized(obj){…}的内部,就必须拿到这个对象的锁,synchronized的机制保证了同一时间最多只能有1个线程拿到了对象的锁,如下图:

在这里插入图片描述

下面我们来看一下这3个方法的作用:

  • wait:线程自动释放其占有的对象锁,并等待notify
  • notify:唤醒一个正在wait当前对象锁的线程,并让它拿到对象锁
  • notifyAll:唤醒所有正在wait前对象锁的线程

notify和notifyAll的最主要的区别是:notify只是唤醒一个正在wait当前对象锁的线程,而notifyAll唤醒所有。值得注意的是:notify是本地方法,具体唤醒哪一个线程由虚拟机控制;notifyAll后并不是所有的线程都能马上往下执行,它们只是跳出了wait状态,接下来它们还会是竞争对象锁。

下面通过一个常用生产者、消费者的例子来说明。
消息实体类:

package com.podongfeng;

/** * Title: Message.class<br> * Description: 消息实体<br> * Create DateTime: 2016年04月17日 下午1:27 <br> * * @author podongfeng */
public class Message { 
   
}

生产者:

package com.podongfeng;

import java.util.ArrayList;
import java.util.List;

/** * Title: Producer.class<br> * Description: 消息生产者<br> * Create DateTime: 2016年04月17日 下午1:28 <br> * * @author podongfeng */
public class Producer extends Thread { 
   

    List<Message> msgList = new ArrayList<>();

    @Override public void run() { 
   
        try { 
   
            while (true) { 
   
                Thread.sleep(3000);
                Message msg = new Message();
                synchronized(msgList) { 
   
                    msgList.add(msg);
                    msgList.notify(); //这里只能是notify而不能是notifyAll,否则remove(0)会报java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
                }
            }
        } catch (Exception e) { 
   
            e.printStackTrace();
        }
    }

    public Message waitMsg() { 
   
        synchronized(msgList) { 
   
            if(msgList.size() == 0) { 
   
                try { 
   
                    msgList.wait();
                } catch(InterruptedException e) { 
   
                    e.printStackTrace();
                }
            }
            return msgList.remove(0);
        }
    }
}

消费者:

package com.podongfeng;

/** * Title: Consumer.class<br> * Description: 消息消费者<br> * Create DateTime: 2016年04月17日 下午1:28 <br> * * @author podongfeng */
public class Consumer extends Thread { 
   

    private Producer producer;

    public Consumer(String name, Producer producer) { 
   
        super(name);
        this.producer = producer;
    }

    @Override public void run() { 
   
        while (true) { 
   
            Message msg = producer.waitMsg();
            System.out.println("Consumer " + getName() + " get a msg");
        }
    }

    public static void main(String[] args) { 
   
        Producer p = new Producer();
        p.start();
        new Consumer("Consumer1", p).start();
        new Consumer("Consumer2", p).start();
        new Consumer("Consumer3", p).start();
    }
}

消费者线程调用waitMsg去获取一个消息实体,如果msgList为空,则线程进入wait状态;生产这线程每隔3秒钟生产出体格msg实体并放入msgList列表,完成后,调用notify唤醒一个消费者线程去消费。

最后再次提醒注意:
wait、notify、notifyAll并不是Thread类或者是Runnable接口的方法,而是Object类的3个本地方法。
在调用这3个方法的时候,当前线程必须获得这个对象的锁

最后的惯例:点个小赞,好运不断,来个关注,青春常驻,打个小赏,工资疯涨。。。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197342.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月5日 下午7:43
下一篇 2025年9月5日 下午8:15


相关推荐

  • 卡方分布、方差分析

    卡方分布:首先我们先把现代数学中的数理统计中的卡方分布已经烂大街的定义先放下来,我先回到卡方检验的诞生的之地。在1900年,皮尔森发表了著名的关于卡方检验的文章,该文章被认为是现代统计学的基石之一。在该文章中,皮尔森研究了拟合优度检验:……(这里之所以加点的原因是因为,下面的话很不好理解,我们举一个实际一点的例子就容易理解了。)下面图片有个赌场的色子(注意阅读下面红色字体)…

    2022年4月8日
    122
  • 毒士:仅凭一计,轻松拿捏当代女帝

    毒士:仅凭一计,轻松拿捏当代女帝

    2026年3月15日
    1
  • 网站错误代码400_网页400错误什么意思

    网站错误代码400_网页400错误什么意思昨天S姐的同事上网冲浪,被提示:404notfound看着她充满求知欲的卡姿兰大眼睛,S姐决定本期讲讲上网冲浪时,你可能遇到的错误代码解析!No.1404无法找到文件404是大家上网冲浪时最常见的错误代码,一般出现的原因可能是:①页面被删除或不存在②网址输入有误③没插网线或没有联网做为生活中最常见的404,除了本身找不到查询页面的含义,还延伸出很多额外的意义。比如:好看的皮囊千篇一律,有趣…

    2026年4月18日
    6
  • sheetjs的使用

    sheetjs的使用https sheetjs com 资源下载地址 xlsx full min js DOCTYPE tmlPUBLIC W3C DTDXHTML1 0Transitiona EN http www w3 org TR xhtml1 DTD xhtml1 transitional dtd lt

    2026年3月19日
    2
  • OpenClaw (龙虾) 本地部署踩坑记录:网络超时、显存优化与中文 Skill 分享

    OpenClaw (龙虾) 本地部署踩坑记录:网络超时、显存优化与中文 Skill 分享

    2026年3月15日
    2
  • 加密connectionStrings

    加密connectionStrings开始菜单>>所有程序>>Microsoftvisualstudio2010>>VisualStudioTools>>VisualStudio命令提示(2010)(如果是windows7,点右键与管理员身份运行)输入aspnet_regiis.exe-pef”connectionStrings””发布后的web.conf…

    2022年5月21日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号