一个庙里, 三个和尚,只有一个碗, 三个和尚都要吃饭,所以每次吃饭的时候, 三个和尚抢着碗吃。

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 使用清晰讲解的更多相关文章

  1. 清晰讲解SQL语句中的内连接,通用于Mysql和Oracle,全是干货哦

    本文章目的:力求清晰明了讲解SQL语句的内连接的各种应用,没有深奥的理解! 前奏:这篇文章和下篇文章会将内连接和外连接讲解清楚SQL语句的多表查询常用的有以下几种:两表联合查询(1)内连接(2)外连接 ...

  2. 清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦

    直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问题:找不到SCOTT员工了,只有13条数据,这显然不合理:这就是内连接的缺 ...

  3. SVM清晰讲解——线性可分问题

    转载作者:liangdas 引言: 1995年Cortes和Vapnik于首先提出了支持向量机(Support Vector Machine),由于其能够适应小样本的分类,分类速度快等特点,性能不差于 ...

  4. 关于清晰讲解linux正则表达式的博文分享

    http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html  linux shell 正则表达式(BREs,EREs,PREs)差异比 ...

  5. 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 ...

  6. 清晰讲解LSB、MSB和大小端模式及网络字节序

    时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ...

  7. Java多线程基础——线程间通信

    在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例 ...

  8. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  9. 大数据入门第二天——基础部分之zookeeper(上)

    一.概述 1.是什么? 根据凡技术必登其官网的原则,我们先去官网瞅一瞅:http://zookeeper.apache.org/ Apache ZooKeeper is an effort to de ...

随机推荐

  1. 父进程pid和子进程pid的大小关系

    如果进程ID最大值没有达到系统进程数的上限,子进程比父进程ID大.但是如果进程ID达到上限,系统会分配之前分配但是已经退出的进程ID给新进程,这样有可能出现子进程ID比父进程小.

  2. python3抓取中国天气网不同城市7天、15天实时数据

    思路:1.根据city.txt文档来获取不同城市code2.获取中国天气网7d和15d不同城市url3.利用requests库请求url获取html内容4.利用beautifulsoup获取7d和15 ...

  3. 安装ELK平台 7.3.0版本

    0. 事前准备工作 0.1 防火墙 若是使用公网IP的话可以考虑关闭防火墙,或者放行相应端口 使用内网IP的话可以不用管防火墙 0.2 关闭SElinux # setenforce 0 文件:/etc ...

  4. neo4j开发自定义存储过程注意事项

    开发自定义的neo4j存储过程(procedures)注意事项及说明: 1.调用方式: 在neo4j的web界面(http://localhost:7474/)命令行输入框内,输入call your_ ...

  5. php转码 iconv和mb_convert_encoding

    最近在给公司做一个小工具,将excel表格按照一定的格式转为txt文本格式,要求转后的txt文本是GBK编码,但是总会有几个excel表格无法正常转码,最后查阅相关资料,得到解决方案 先说明下,在ph ...

  6. vue引入jquery插件

    在vue中使用jquery插件 1.引入jquery 第一种方法:全局引入jquery 在webpack.base.conf.js,新增以下代码 plugins: [ new webpack.opti ...

  7. css的样式问题

    项目里面遇到一个布局: 然后侧边栏菜单的高度要随着内容的高度变化而变化:所以在这里贴一下代码:效果如下 <!DOCTYPE html> <html lang="en&quo ...

  8. Centos7安装Python3的方法[转]

    Centos7安装Python3的方法   由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. [root@VM_105_217_ ...

  9. info - 阅读 info 文档

    SYNOPSIS 总览 info [OPTION]... [MENU-ITEM...] DESCRIPTION 描述 阅读 info 格式的文档. OPTIONS 选项 --apropos=STRIN ...

  10. zabbix 添加图行树

    1.安装graphtree cd /usr/share/zabbix wget https://raw.githubusercontent.com/OneOaaS/graphtrees/master/ ...