当前位置: 代码迷 >> 综合 >> Object.wait()方法异常java.lang.IllegalMonitorStateException
  详细解决方案

Object.wait()方法异常java.lang.IllegalMonitorStateException

热度:40   发布时间:2023-09-29 07:40:12.0

在使用Object.wait()方法时抛出了异常,代码如下:

    /*** 所有处理线程的等待对象*/private Object waitObject;private boolean isRunning = false;public MessageHandleRunnable(Object waitObject, ArrayBlockingQueue<String> queue){this.waitObject = waitObject;this.queue = queue;}private void handle(){isRunning = true;while(isRunning && !isInterrupted()) {String result = takeMessage();if (StringUtils.isEmpty(result)) {try {System.out.println(String.format("%s线程进入wait状态目前wait状态数量:%s ", name, MyMessageListener.waitThreadCountIncrease()));waitObject.wait(10 * 60 * 1000);System.out.println(String.format("%s线程进入wait状态目前wait状态数量:%s ", name, MyMessageListener.waitThreadCountSubstract()));} catch (InterruptedException e) {e.printStackTrace();}} else {System.out.println(name+ "-- 处理消息:" + result);}}System.out.println(name +"数据处理线程停止");}

原因是,在使用Object的wait()、notify()、notifyAll()时,需要是线程安全的,所以必须要加上synchronized关键字。且synchronized锁对象必须是Object本身(否则notify()、notifyAll()方法会失效),且对象必须是已经初始化的。

修改如下:

private void handle(){isRunning = true;while(isRunning && !isInterrupted()) {String result = takeMessage();if (StringUtils.isEmpty(result)) {try {synchronized (waitObject) {System.out.println(String.format("%s线程进入wait状态目前wait状态数量:%s ", name, MyMessageListener.waitThreadCountIncrease()));waitObject.wait(10 * 60 * 1000);System.out.println(String.format("%s线程进入wait状态目前wait状态数量:%s ", name, MyMessageListener.waitThreadCountSubstract()));}} catch (InterruptedException e) {e.printStackTrace();}} else {System.out.println(name+ "-- 处理消息:" + result);}}System.out.println(name +"数据处理线程停止");}

 

  相关解决方案