关于IllegalMonitorStateException异常的解释之一
注意
在同步控制方法或同步控制块里调用wait(),notify()和notifyAll()。如果在非同步控制方法里调用这些方法,程序能通过编译,但运行的时候,将得到IllegalMonitorStateException异常,并伴随着一些含糊的消息,比如"当前线程不是拥有者"。消息的意思是,调用wait(),notify()和notifyAll()的线程在调用这些方法前必须"拥有"对象的锁。当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常。
package pro_cus; /**
* 生产者
*/
public class Productor extends Thread{ private Clerk clerk;
private int times=0;
public Productor(Clerk clerk) {
this.clerk = clerk;
}
public void run() { synchronized(clerk) {
while(times < 11) {
if(clerk.pros == 5) {
try {
clerk.wait(); // 不能使用 wait 如果不用clerk. 则wait方法的调用者是Productor,不是当前线程的锁对象,
// 当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
clerk.pros++;
clerk.notify(); //不能使用notify 不能使用 notify 如果不用clerk. 则notify方法的调用者是Productor,不是当前线程的锁对象,
// 当前的线程不是此对象锁的所有者,却调用该对象的notify(),notify(),wait()方法时抛出该异常
System.out.println("生产["+clerk.pros+"]号产品");
System.out.println("生产第["+(times+1)+"]次");
times++;
}
}
}
} package pro_cus; /**
* 消费者
* @author Gary
* @time 2019年8月22日
*/
public class Cus extends Thread{ private Clerk clerk;
private int times=0; public Cus(Clerk clerk) {
this.clerk = clerk;
}
public void run() { synchronized(clerk) {
while(times<11) {
if(clerk.pros==0) {
try {
clerk.wait(); //不能使用wait 同理
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
clerk.pros--;
clerk.notifyAll(); //不能使用 notifyAll 同理
times++;
System.out.println("消费["+clerk.pros+"]号产品");
System.out.println("第["+times+"]次消费");
}
}
}
} ------测试
package pro_cus; public class Clerk { public int pros=0; public static void main(String[] args) { Clerk clerk = new Clerk();
Productor pro = new Productor(clerk);
Cus cus = new Cus(clerk); pro.start();
cus.start(); }
}
关于IllegalMonitorStateException异常的解释之一的更多相关文章
- 关于IllegalMonitorStateException异常
关于IllegalMonitorStateException异常: api中的解释 另请参见: Object.notify(), Object.notifyAll(), Object.wait(), ...
- (四)关于java.lang.IllegalMonitorStateException异常说明
1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...
- 关于java.lang.IllegalMonitorStateException异常说明(四)
1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...
- Python3基础 raise + 指定类型异常+异常的解释 产生特定类型异常
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法
代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...
- Java常见异常及解释
- java.lang.IllegalMonitorStateException异常
转自:https://blog.csdn.net/qianshangding0708/article/details/48290937
- appium中driver.wait报IllegalMonitorStateException的解释
在写appium代码的时候,有的人想使用wait方法,写成:driver.wait(),结果抛出异常:IllegalMonitorStateException,看了appium client的api文 ...
- java常见异常集锦
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- java开发异常类型汇总
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
随机推荐
- unittest学习总结
2022-02-21 15:03:20 unittest --- 单元测试框架 - Python 3.9.10 文档 可以自由选择版本文档查看 一.unittest概念 unittest是Python ...
- csp2020——T3表达式
后缀表达式基本可以使用栈来表达,所以30分的暴力做法很好做 正解的做法是: 暴力的做法是每次重新建立栈,用符号来把栈顶的元素弹出来,做完运算之后再放入栈中,如果是与运算,弹出两个元素,如果是或运算,弹 ...
- jmeter压测dubbo接口,参数为dto时如何写传参及有错误时的分析思路
一.传参 1. 无论dubbo接口传参是否为dto,所有参数都是在args的tab传进去的. 2. 如果dto中有自定义对象,paramType为自定义dto名,paramValue为其他参数组成的j ...
- 【阿里云ACP】-03(数据库RDS)
OSS快速使用入门:创建Bucket 1.用户创建一个Bucket时,可以根据费用单价.请求来源分布.响应延迟等方面的考虑,为该bucket选择所在的数据中心 阿里云所有数据中心都提供OSS公众服务 ...
- python manage.py loaddata dumpdata 用于导出和导入数据库中的数据
1.数据导出python manage.py dumpdata python manage.py dumpdata [appname] > appname_data.json 指定appna ...
- 运行yarn报错:error C:\liuyan\tools\echarts-5.4.0\node_modules\cwebp-bin: Command failed.
完成warning和报错信息如下. 通过报错信息提示,锁定cwebp-bin,在waring中发现有提示说要更新至7或更高版本. 解决方案:在package.json中,将cwebp-bin设置版本为 ...
- 30.zookeeper部署
(一)Zookeeper基础知识.体系结构.数据模型 1 zookeeper是一个类似linux.hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致. 2 ...
- Oracle数据泵恢复用户数据实例
我们测试环境经常会遇到恢复生产数据的情况,我一般比较习惯使用数据泵来搞,这个具体根据自己的业务形态选择适合自己的方式. 此次我们说的是完全恢复用户数据,具体步骤如下: 1.备份数据 expdp tes ...
- 【IDEA】测试类(test)的模板及定义
人和动物的区别是:能制造和使用工具.因为,工具大大便利了我们的生活. 我们在使用Idea开发java项目的过程中,有些代码是固定的,我们能不能只写几个字,就代表一连串的代码.例如,这里,我们只是输入了 ...
- vue v-for 循环中,下拉框 el select 设置初始值 v-model
效果图: 2.解决思路是,v-model 赋值 单独创建一个数组,然后用于接收下拉框的值,然后提交的时候,将这个数组的值,放到提交的数组中. 3.参考: 解决v-for中遍历多个el-select时, ...