关于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 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
随机推荐
- python checklist
1. 常用模块:subprocess, requests, paramekio, traceback, argparse, numpy, pandas 2. 赋值传递和引用传递 python是赋值传递 ...
- 写于vue3.0发布前夕的helloworld
前言: vue3.0马上要来了,于今昔写一篇vue将一个字符串hellowrold渲染于页面的过程,慰藉我这几个月写vue的'枯燥'. 源码版本是2.6.10. 开始: 我们的模板足够简单: < ...
- MSSQL Always Encrypted 加密
载自:https://zhuanlan.zhihu.com/p/63674006 文档资源:https://docs.microsoft.com/zh-CN/sql/relational-databa ...
- SAP 结构转JSON
*使用方式 jsonstr = zui2_json=>serialize( data = ls_in compress = abap_true pretty_name = zui2_json=& ...
- Feign组件
一.简介 Feign是Netflix开发的声明式,模块化的HTTP客户端 1 导入依赖 <dependency> <groupId>org.springframework.cl ...
- promethus+grafana监控
1.监控 MySQL (终端可以安装在任意主机,不一定按在mysql节点上,注:mysql版本需在5.5以上) I.首先在mysql中添加监控使用的用户: create user 'exp'@'%' ...
- Ant Design 抽屉(tabel)
效果图如下,因部分涉及到人员隐私,所以打码了,就是一些图片文字信息. 有不足的地方可以麻烦提出来的,一起学习的. <template> <a-drawer v-model:visib ...
- 作业一:PCA降维练习
作业一:PCA降维作业 代码 点击查看代码 #author:qiao_px #@Time 2022/10/31 16:11 #@File ceshiPCA.py import pandas as pd ...
- uiautomator2 常用方法
常用功能方法的整理和总结 导入 import uiautomator2 as u2 连接ADB设备: 可以通过USB或Wifi与ADB设备进行连接,进而调用Uiautomator2框架,支持同时连接单 ...
- java mybatisplus+springboot服务器跨域问题
项目本地增删改测试正常,上传到 阿里服 页面出现了 跨域报错问题! 解决方案:添加一个过滤器 package com.rl;import org.springframework.stereotyp ...