0 0

关于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讲解

    wait和notify讲解

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    java之wait,notify的用法([ 详解+实例 ])

    Java之wait和notify的用法详解 在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    wait_notify_demo

    总结来说,Java的`wait()`、`notify()`和`notifyAll()`方法是实现多线程间协作的关键工具,特别是对于解决生产者消费者问题。理解它们的工作原理和正确使用方式对于编写高效的并发代码至关重要。在上述示例中,我们...

    深入理解Wait、Notify和Wait与sleep区别

    在实际开发中,`wait()`, `notify()`和`notifyAll()`常用于实现生产者-消费者模型、哲学家就餐问题等经典并发问题。它们提供了一种精细控制线程间交互的方式,但使用时需谨慎,避免死锁和活锁的发生。 总之,理解和...

    Java的sychronized、wait和notify范例

    `synchronized`关键字、`wait()`和`notify()`方法是Java多线程中用于控制并发访问共享资源的重要工具,它们是Java内存模型(JMM)的一部分,主要用于解决线程间的同步问题。 一、`synchronized`关键字 `...

    java中几个notify、wait使用实例

    在Java的多线程编程中,`notify()`与`wait()`是实现线程间通信的重要方法,它们主要用于解决生产者消费者问题、读者写者问题等典型同步问题。这两个方法定义在`Object`类中,因此所有Java对象都可以作为锁来使用。在...

    JAVAWAIT和NOTIFY的用法.pdf

    JAVAWAIT和NOTIFY的用法.pdf

    主线程去控制子线程wait与notify

    总的来说,主线程控制子线程的`wait()`和`notify()`操作是Java并发编程中的高级技巧,它允许我们构建更复杂、更高效的应用程序,通过线程间的协作来解决问题。理解和掌握这些概念对于编写高并发、高性能的Java应用...

    一个理解wait()与notify()的例子

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

    如何在Java中正确使用 wait, notify 和 notifyAll

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    wait,notify等线程知识.pdf

    使用wait/notify机制时,需要注意死锁和活锁问题。死锁发生在两个或更多线程互相等待对方释放资源的情况下。活锁则是线程不断尝试获取资源但一直失败,导致无限期阻塞。合理设计同步策略和避免这些情况是多线程编程...

    java-wait和notify的用法.pdf

    在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...

    浅谈java多线程wait,notify

    在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的通信和同步。在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在...

    Java 同步锁 wait notify 学习心得

    标题和描述概述的知识点主要集中在Java的多线程机制中,特别是`wait`和`notify`方法在同步锁中的应用。这些方法对于控制线程之间的交互至关重要,尤其是在资源有限或需要确保数据一致性的情况下。 ### Java同步锁...

    wait()、notify()和notifyAll()方法2---马克-to-win java视频

    wait()、notify()和notifyAll()方法2---马克-to-win java视频

Global site tag (gtag.js) - Google Analytics