wait, notify 使用清晰讲解
一个庙里, 三个和尚,只有一个碗, 三个和尚都要吃饭,所以每次吃饭的时候, 三个和尚抢着碗吃。
package interview.java.difference.l05;
public class WaitAndNotifyAndNotifyAll {
    static class Bowl{
        private String id;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
    }
    static class Monk1Eat implements Runnable{
        private Bowl bowl;
        private String name;
        public Monk1Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk1";
        }
        public String getName() {
            return name;
        }
        public void run() {
            while(true){
                System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
            }
        }
    }
    static class Monk2Eat implements Runnable{
        private Bowl bowl;
        private String name;
        public Monk2Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk2";
        }
        public String getName() {
            return name;
        }
        public void run() {
            while(true){
                System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
            }
        }
    }
    static class Monk3Eat implements Runnable{
        private Bowl bowl;
        private String name;
        public Monk3Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk3";
        }
        public String getName() {
            return name;
        }
        public void run() {
            while(true){
                System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
            }
        }
    }
    public static void main(String[] args) {
        Bowl bowl = new Bowl();
        bowl.setId("onlyOneBowl");
        Thread monk1=new Thread(new Monk1Eat(bowl));
        Thread monk2=new Thread(new Monk2Eat(bowl));
        Thread monk3=new Thread(new Monk3Eat(bowl));
        monk1.start();
        monk2.start();
        monk3.start();
    }
}
之后 三个和尚懂得互相谦让了。 每个人吃5分钟,换另一个人吃,随机换,这时候,停下吃的那个和尚等待,并把碗给另一个人。注意,是锁wait,然后锁notify另一个人。不是和尚wait然后notify,这样会报出illegalmonitorstate的异常。
package interview.java.difference.l05;
public class WaitAndNotifyAndNotifyAll {
    static class Bowl{
        private String id;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
    }
    static class Monk1Eat implements Runnable{
        private Bowl bowl;
        private String name;
        private long now;
        public Monk1Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk1";
            now=System.currentTimeMillis();
        }
        public String getName() {
            return name;
        }
        public void run() {
            synchronized (bowl) {
                while(true){
                        try {
                            bowl.wait(3*1000);
                            bowl.notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
                    try {
                        System.out.println(this.getName()+" is digesting");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    static class Monk2Eat implements Runnable{
        private Bowl bowl;
        private String name;
        private long now;
        public Monk2Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk2";
            now=System.currentTimeMillis();
        }
        public String getName() {
            return name;
        }
        public void run() {
            synchronized (bowl) {
                while(true){
                        try {
                            bowl.wait(3*1000);
                            bowl.notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
                    try {
                        System.out.println(this.getName()+" is digesting");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    static class Monk3Eat implements Runnable{
        private Bowl bowl;
        private String name;
        private long now;
        public Monk3Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk3";
            now=System.currentTimeMillis();
        }
        public String getName() {
            return name;
        }
        public void run() {
            synchronized (bowl) {
                long now=System.currentTimeMillis();
                while(true){
                        try {
                            bowl.wait(3*1000);
                            bowl.notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
                    try {
                        System.out.println(this.getName()+" is digesting");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        Bowl bowl = new Bowl();
        bowl.setId("onlyOneBowl");
        Thread monk1=new Thread(new Monk1Eat(bowl));
        Thread monk2=new Thread(new Monk2Eat(bowl));
        Thread monk3=new Thread(new Monk3Eat(bowl));
        monk1.start();
        monk2.start();
        monk3.start();
    }
}
使用线程去notify 和wait
代码:
package interview.java.difference.l05;
public class WaitAndNotifyAndNotifyAll {
    static class Bowl{
        private String id;
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
    }
    static class Monk1Eat implements Runnable{
        private Bowl bowl;
        private String name;
        private long now;
        public Monk1Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk1";
            now=System.currentTimeMillis();
        }
        public String getName() {
            return name;
        }
        public void run() {
            synchronized (bowl) {
                while(true){
                        try {
                            Thread.currentThread().wait(3*1000);
                            Thread.currentThread().notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
                    try {
                        System.out.println(this.getName()+" is digesting");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    static class Monk2Eat implements Runnable{
        private Bowl bowl;
        private String name;
        private long now;
        public Monk2Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk2";
            now=System.currentTimeMillis();
        }
        public String getName() {
            return name;
        }
        public void run() {
            synchronized (bowl) {
                while(true){
                        try {
                            Thread.currentThread().wait(3*1000);
                            Thread.currentThread().notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
                    try {
                        System.out.println(this.getName()+" is digesting");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    static class Monk3Eat implements Runnable{
        private Bowl bowl;
        private String name;
        private long now;
        public Monk3Eat(Bowl bowl){
            this.bowl=bowl;
            name="monk3";
            now=System.currentTimeMillis();
        }
        public String getName() {
            return name;
        }
        public void run() {
            synchronized (bowl) {
                long now=System.currentTimeMillis();
                while(true){
                        try {
                            Thread.currentThread().wait(3*1000);
                            Thread.currentThread().notify();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    System.out.println(this.getName()+" is eating with bowl"+bowl.getId());
                    try {
                        System.out.println(this.getName()+" is digesting");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        Bowl bowl = new Bowl();
        bowl.setId("onlyOneBowl");
        Thread monk1=new Thread(new Monk1Eat(bowl));
        Thread monk2=new Thread(new Monk2Eat(bowl));
        Thread monk3=new Thread(new Monk3Eat(bowl));
        monk1.start();
        monk2.start();
        monk3.start();
    }
}
报错:
Exception in thread "Thread-0" Exception in thread "Thread-2" Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at interview.java.difference.l05.WaitAndNotifyAndNotifyAll$Monk1Eat.run(WaitAndNotifyAndNotifyAll.java:)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at interview.java.difference.l05.WaitAndNotifyAndNotifyAll$Monk2Eat.run(WaitAndNotifyAndNotifyAll.java:)
at java.lang.Thread.run(Unknown Source)
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at interview.java.difference.l05.WaitAndNotifyAndNotifyAll$Monk3Eat.run(WaitAndNotifyAndNotifyAll.java:)
at java.lang.Thread.run(Unknown Source)
wait, notify 使用清晰讲解的更多相关文章
- 清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦
		本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接 ... 
- 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
		直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理:这就是内连接的缺 ... 
- SVM清晰讲解——线性可分问题
		转载作者:liangdas 引言: 1995年Cortes和Vapnik于首先提出了支持向量机(Support Vector Machine),由于其能够适应小样本的分类,分类速度快等特点,性能不差于 ... 
- 关于清晰讲解linux正则表达式的博文分享
		http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html linux shell 正则表达式(BREs,EREs,PREs)差异比 ... 
- Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)”  清晰讲解logistic-good!!!!!!
		原文:http://52opencourse.com/125/coursera%E5%85%AC%E5%BC%80%E8%AF%BE%E7%AC%94%E8%AE%B0-%E6%96%AF%E5%9D ... 
- 清晰讲解LSB、MSB和大小端模式及网络字节序
		时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ... 
- Java多线程基础——线程间通信
		在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例 ... 
- 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
		首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ... 
- 大数据入门第二天——基础部分之zookeeper(上)
		一.概述 1.是什么? 根据凡技术必登其官网的原则,我们先去官网瞅一瞅:http://zookeeper.apache.org/ Apache ZooKeeper is an effort to de ... 
随机推荐
- python中迭代器和生成器。
			前言:很多python教程中,对python的解释不容易理解,本文记录自己的理解和体会,是对迭代器和生成器的初步理解. 迭代器: 迭代器的实质是实现了next()方法的对象,常见的元组.列表.字典都是 ... 
- Win7(64位)下安装Anaconda+Tensorflow(CPU)
			一.安装Python 3.5 下载Anaconda网址:https://www.anaconda.com/download/ 安装:Anaconda3-4.2.0-Windows-x86_64.exe ... 
- 最近用到的postgresql 的一些操作
			通过Linux命令行连接:在本机上连接操作 第一步:su - postgres进入到这个:-bash-4.2$ 第二步:psql进入到数据库 切换数据库: 命令:\c dbname 进入到数据库中 查 ... 
- Codeforces 1220C. Substring Game in the Lesson
			传送门 首先显然的,如果 $l$ 能移动,那么 $r$ 一定可以随便移动,如果 $l$ 不动,那么 $r$ 一定不能动 那么我们现在只要考虑 $l$ 的移动即可 考虑找到位置 $k$ 之前的最左边的最 ... 
- Codeforces 1215E. Marbles
			传送门 注意到 $a$ 的值的数量并不大,考虑状压 $dp$ 设 $f[S]$ 表示此时确定的数集合为 $S$ ,且按某种顺序从数列开头排列完成的最小交换次数 那么每个状态枚举最后一个填的数,加上代价 ... 
- 推荐JavaScript动态效果库
			翻译:疯狂的技术宅,原文:https://blog.bitsrc.io/11-javascript-animation-libraries-for-2018-9d7ac93a2c59 当我想要在网上找 ... 
- Tableau Dashboard
			Dashboard仪表盘,用来展示多个图表,并展示之间的联动,分析数据. 
- __name__='main'  这句代码是什么意思?《读书笔记》
			当我们阅读 别人的python代码都会有 if name == "main"这么一行语句,但却不知道为什么要写这个?有什么用 想知道这段代码什么意思让我们来根据例子来测试一下 我们 ... 
- dns服务的基本配置
			本文环境:CentOS 7 简介 DNS(Domain Name System)即域名服务系统,是Internet上用的最频繁的服务之一,它的本质是一个范围很广的分布式数据库,组织成域层次结构的计算机 ... 
- 在同一个方法里,有redis,数据库和api,如何保证方法的事务性或者最终一致性?
			https://segmentfault.com/q/1010000017519179/a-1020000017547192 
