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进阶编程 类的成员
类的成员 class A: company_name='老男孩' #静态变量 __iphone='1515151' #私有静态变量 def __init__(self,name,age): #特殊方法 ...
- 网络架构,七层协议,三次握手四次挥手,socket套接字简单编程
一.单机架构 应用领域: 植物大战僵尸 office 二.CS架构 应用领域: QQ 大型网络游戏 计算机发展初期用户去取数据,直接就去主机拿,从这里开始就分出了客户端和服务端. 客户端:用户安装的软 ...
- python with hadoop
python with hdfs hdfs 可以在 linux 本地操作 bin/hdfs dfs -ls /foo 但是这种只能在 命令行 操作. 通常我们需要在程序中实现远程操作,python ...
- 请求转发forward()和URL重定向redirect()的区别
- CSS3 @keyframes 实现匀速旋转魔方(搬运工)
原博文 * https://www.cnblogs.com/shihao905/p/6208324.html * html <div id="wrap"> <di ...
- cx_Oracle 操作oracle数据库
cx_Oracle 操作oracle数据库 class MyOracle(): def __init__(self, host_name="ip", port=1521, sid= ...
- 在docker容器中为elasticsearch配置跨域访问
一.在docker容器中进入elasticsearch对应的容器 docker exec -it [容器名] /bin/bash 二.安装vim编辑器 因为我们需要更改配置文件,安装过的朋友就不用安装 ...
- Malloc与Free不调用构造函数与析构函数
例子: #include "stdafx.h" #include <new> #include <iostream> using namespace std ...
- INSERT - 在表中创建新行
SYNOPSIS INSERT INTO table [ ( column [, ...] ) ] { DEFAULT VALUES | VALUES ( { expression | DEFAULT ...
- tp5 apache 转 nginx 需要配置的伪静态
location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$ last; break; } }