使用Thread的wait方法与notify方法时遇到的IllegalMonitorStateException
来源:互联网 发布:js写日历 编辑:程序博客网 时间:2024/06/04 23:30
以下代码是用来作同步处理使用的,当线程城运行后,this.currentThread.wait()这句会让线程等待,减少性能损耗。当我有数据要处理时调用handleObject来唤醒线程。
public synchronized void handleObject(RpcInvocation rpcInvocation) { this.rpcInvocation = rpcInvocation; this.currentThread.notify(); } @Override public void run() { try { this.currentThread = Thread.currentThread(); while (this.running) { this.currentThread.wait(); if (this.rpcInvocation != null) { //处理rpcInvocation } } } catch (IOException | ClassNotFoundException | InterruptedException e) { logger.error(e.getMessage(), e); } finally { //结束 } }
不过这段代码运行到第三行时,会出现IllegalMonitorStateException,这是因为调用handleObject的线程不是调用wait()方法的线程,而调用handleObject的线程没有权去notify(),因此会出现IllegalMonitorStateException。
出现这个Exception的原因有下面几个:
1、当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;
2、当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法。
3、当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法。
解决方案,当wait()和notify()方法都在同一个锁对象下,则能正常解锁:
public synchronized void handleObject(RpcInvocation rpcInvocation) { this.rpcInvocation = rpcInvocation; synchronized (this.currentThread) { this.currentThread.notify(); } } @Override public void run() { try { this.currentThread = Thread.currentThread(); while (this.running) { synchronized (this.currentThread) { this.currentThread.wait(); } if (this.rpcInvocation != null) { //处理rpcInvocation } } } catch (IOException | ClassNotFoundException | InterruptedException e) { logger.error(e.getMessage(), e); } finally { //结束 } }
1 0
- 使用Thread的wait方法与notify方法时遇到的IllegalMonitorStateException
- 生产者与消费者模型 wait() · notify() 方法的使用
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Java中的Object的Wait() 和notify()方法使用时应注意的地方和Thread中的sleep()方法
- Object的Wait() 和notify()方法使用
- wait与notify方法
- java wait()方法和notify()方法的使用
- Thread的join()方法和Object的wait(),notify(),notifyAll()方法
- java notify()和notifyall()的区别&wait()方法的使用
- Java线程的挂起与恢复 wait(), notify()方法介绍
- 多线程并发中的简单使用wait和notify的方法
- Java线程等待wait通知notify方法的使用
- 多线程中的notify和wait方法的使用
- 多线程中的notify和wait方法的使用
- Java的notify,wait,notifyAll方法使用介绍
- 线程中 Object对象的wait和notify方法使用,
- 实习问题小汇总
- 小tip:中文英文左右padding一致两端对齐实
- 一对一映射
- Elasticsearch5.0学习与理解翻译(一)
- CentOS7下安装Oracle12c后的一些相关工作
- 使用Thread的wait方法与notify方法时遇到的IllegalMonitorStateException
- 牛客网自测试题20170307
- java编程思想之控制执行流程
- 02:输出第二个整数
- linux 查看crontab日志
- number
- android开发中如何从当前页面返回上一页面
- javaScript对象转换为原始值的过程
- 欢迎使用CSDN-markdown编辑器