-
关于wait 和 notify 的问题?求指教30
写了个同步的东东但是一直抛异常:
java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at org.platform.webservice.MessageControl.SendMessage(MessageControl.java:79)
at org.platform.servlet.RequestSevlet.doPost(RequestSevlet.java:62)
at org.platform.servlet.RequestSevlet.doGet(RequestSevlet.java:42)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)
能帮忙看下什么问题吗?package org.platform.webservice; import java.util.Hashtable; import java.util.Map; import java.util.UUID; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import org.platform.util.SysConfigManager; import com.coreframework.util.Asserter; public class MessageControl { private static Map<String, SynchronizedObj> map = new Hashtable<String, SynchronizedObj>(); private static Map<String,BlockingQueue<String>> keymap = new Hashtable<String, BlockingQueue<String>>(); public static String GetMessage(WSRequest request) { String hosid = request.getHosid(); String uuid = UUID.randomUUID().toString(); BlockingQueue<String> poollist = keymap.get(hosid); if(null == poollist){ poollist = new LinkedBlockingQueue<String>(); keymap.put(hosid, poollist); } String poolUid = hosid+uuid; poollist.add(hosid+uuid); SynchronizedObj obj = new SynchronizedObj(poolUid); map.put(poolUid, obj); try { long timeout = SysConfigManager.getInstance().getWSMesageTimeOut(); synchronized (obj) { obj.wait(timeout); String result = obj.getResult()!=null?obj.getResult().toString():null; if(null != result && !"".equals( result )){ return result; } else { return "null"; //return getResponse( request.getHosid(), request.getApi(), -123, "请求超时!请重新发起请求.").asXml(false); } } } catch (Exception e) { e.printStackTrace(); return e.getLocalizedMessage(); //return getResponse( request.getHosid(), request.getApi(), -123, "请求异常!请重新发起请求.").asXml(false); } } /*** * <Api>BOSS-GH</Api> * <UUID>aaaaaaaaaa</UUID> * <Request> * <Name>a</Name> * </Request> * @param hosid * @param args * @return * @throws Exception */ public static String SendMessage(String hosid,String args) throws Exception{ String requestUUID = UUID.randomUUID().toString(); String key = requestUUID + hosid; BlockingQueue<String> pools = keymap.get(hosid); Asserter.notNull(pools, "没有请求连接.HosID = "+ hosid); Asserter.notEmpty(pools, "连接池没有连接."); String hospool = pools.peek(); SynchronizedObj object = map.get(hospool); ResponseMessage msg = new ResponseMessage(); msg.setUuid(key); msg.setMessage(args); object.setResult(msg); object.notifyAll(); SynchronizedObj obj = new SynchronizedObj(key); map.put(key, obj); synchronized (obj) { try { obj.wait(20*1000); return obj.getResult().getResult().toString(); } catch (InterruptedException e) { e.printStackTrace(); return null; } } } }
调用GetMessage方法时对象进入等待状态;
然后调用SendMessage 时取到该对象释放锁,可是为什么会抛异常?2012年8月13日 18:05
目前还没有答案
相关推荐
wait和notify讲解
Java 同步方式 wait和notify/notifyall
使用Java多线程的wait和notify方法实现最简单的生产者消费者模式
3(深入理解Wait、Notify和Wait与sleep区别).rar
开一个子线程来完成一个循环处理的工作,我在主线程中能灵活控制这个子线程的开始、暂停/继续、结束。
java多线程之wait,notify的用法([ 详解+实例 ]).
JAVAWAIT和NOTIFY的用法.pdf
java-wait和notify的用法.pdf
Java多线程的样例代码,工程,内含wait()、notify()和sychronized的使用范例。
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现...
源码—Java多线程5—死锁和wait notify notifyAll
主线程去控制子线程wait与notify
java中多线程编程notify、wait的使用
wait()、notify()和notifyAll()方法1---马克-to-win java视频
一个理解wait()与notify()的例子,让你更好理解.
java多线程下wait和notify的作用
wait,notify等线程知识.pdf
wait()、notify()和notifyAll()方法2---马克-to-win java视频
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。