注意

  在同步控制方法或同步控制块里调用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异常的解释之一的更多相关文章

  1. 关于IllegalMonitorStateException异常

    关于IllegalMonitorStateException异常: api中的解释  另请参见: Object.notify(), Object.notifyAll(), Object.wait(), ...

  2. (四)关于java.lang.IllegalMonitorStateException异常说明

    1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...

  3. 关于java.lang.IllegalMonitorStateException异常说明(四)

    1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源 ...

  4. Python3基础 raise + 指定类型异常+异常的解释 产生特定类型异常

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. Java中线程出现Exception in thread "Thread-0" java.lang.IllegalMonitorStateException异常 解决方法

    代码 package thread; public class TestChongNeng { public static void main(String[] args) { Thread t1 = ...

  6. Java常见异常及解释

  7. java.lang.IllegalMonitorStateException异常

    转自:https://blog.csdn.net/qianshangding0708/article/details/48290937

  8. appium中driver.wait报IllegalMonitorStateException的解释

    在写appium代码的时候,有的人想使用wait方法,写成:driver.wait(),结果抛出异常:IllegalMonitorStateException,看了appium client的api文 ...

  9. java常见异常集锦

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

  10. java开发异常类型汇总

    1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...

随机推荐

  1. 解决pdf电子签章显示问题(电子发票)

    在/build/pdf.worker.js注释掉一行代码 if (data.fieldType === "Sig") { data.fieldValue = null; // 注释 ...

  2. 通过抓取pintpoint2的页面信息把数据存入数据库python3

    目标:对生产环境的服务质量进行量化, 解决办法:把pintpoint2里的数据转存入mysql数据库,作成报表,目前支持总请求数,错误请求数,中位数,平均数,95值(每分钟一次定时任务),其它指标可以 ...

  3. 【C和指针】6.指针

    1.指针变量的内容 int a=112, b=-1; float c=3.14; int *d=&a; int *e=&c; (1) 变量d和e被声明为指针,并用其他变量的地址予以初始 ...

  4. NOI 1.7编程基础之字符串

    11:潜伏者 1.描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军用密码的编码规则: 1.    S国军方内部欲发送的原信 ...

  5. wait notify 实例,生产消费者模式(转)

    今天发现了一段很标准的多线程代码,记得以前也写过,但是没有这个这么小巧和标准. import java.util.LinkedList; import java.util.Queue; import ...

  6. 如何获取android环境自带的jar包

    首先找到你需要用到的类,Ctrl 并点击跳转到这个类 跳转过来之后,找到这个类所在的包 Ctrl并点击,此时会跳转到这个包所在的jar的位置 右键class.jar并选择在文件资源浏览器打开 打开以后 ...

  7. wand,week and 算法

    一般搜索的query比较短,但如果query比较长,如是一段文本,需要搜索相似的文本,这时候一般就需要wand算法,该算法在广告系统中有比较成熟的应该,主要是adsense场景,需要搜索一个页面内容的 ...

  8. 学python有了这些书你还担心有什么学不会的吗

    百度云盘:Python高级编程PDF高清完整版书籍免费下载 提取码:bn9d 内容简介  · · · · · · <Python高级编程>通过大量的实例,介绍了Python语言的最佳实践和 ...

  9. python与java中符号表达式的区别

    python与java中符号表达式的区别 1:三目运算符 python  语句1(表达式1)  if  条件表达式A  else  语句2(表达式2) 执行过程:首先,运算条件表达式A,如果为True ...

  10. VUE基础 · 绑定(1)

    前端三大框架:Angular.js.React.js.Vue.js,目前最热的是Vue,并且使用的热度还在递增中. Vue已经将操作页面的方法封装好,我们只需要对数据进行修改就可以完成页面的显示.Vu ...