`
youyun_2008
  • 浏览: 113722 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

java.lang.IllegalMonitorStateException 异常 解析

阅读更多
首先看下官方的解释:
void notify()
          唤醒在此对象监视器上等待的单个线程。
void notifyAll()
          唤醒在此对象监视器上等待的所有线程。
void wait()
          导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

下面是一段实例:


public class OtherObject {
	public synchronized void await(){
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public synchronized void anotify(){
		notifyAll();
	}
}



public class ShareDataThread implements Runnable{

	private static String name;
	
	/** 
	 * wait()导致当前的线程等待,直到其他线程调用此对象(the same object 
	 *	like: OtherObject)的 notify() 方法或 notifyAll() 方法。
	**/
	private static OtherObject oo = new OtherObject();
	
	@Override
	public  void run() {
			name = "simon";
			oo.anotify();
	}
	
	public static void main(String[] args){
		Thread t = new Thread(new ShareDataThread());
		t.start();
		//method 1
		/*try {
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}*/
		
		//method 2
		while(name == null){
			System.out.println("before");
			oo.await();
		}
		System.out.println(name);
	}
	
}


注意上面的 wait() 和 notify()/notifyAll() 必须在调用同一个实例对象的。
因为在统一实例对象之间这两个方法才是相关联的,wait()方法执行后,通过notify()/notifyAll()才能唤醒wait()方法。
分享到:
评论

相关推荐

    SCJP 1.6 10年5月最新真题

    `java.lang.RuntimeException: Problem`是异常的信息,不会直接打印到控制台。 - **选项B**:错误。`run. java.lang.RuntimeException: Problem`虽然包含了`run.`,但是没有正确地表示出`End of method.`的输出顺序...

    SCJP认证考题310-065

    通过这些解析,我们可以了解到Java多线程编程的一些基本概念和常见陷阱,例如如何处理异常、死锁的预防以及`synchronized`和`wait()/notify()`的正确使用方式等。对于准备SCJP认证考试的学习者来说,掌握这些知识点...

    JAVA程序员面试题2

    2. **String 类**:`String`类虽然经常用于基础数据处理,但实际上它不是基本数据类型,而是引用类型,属于`java.lang`包下的一个类。`String`类是不可变的,即一旦创建了一个`String`对象,它的内容就不能更改。 3....

    ORACLE认证考试ocjp题库(覆盖率99%)本人刚考完

    - `Exception in thread "Thread-0" java.lang.RuntimeException: Problem` - **解析**: - 当主线程启动后,会先打印 `Endofmethod.`。 - 启动的线程执行 `run()` 方法,打印 `run.` 并抛出异常。 - 异常被捕获...

    310-065.pdf

    根据给定文件的信息,我们可以深入探讨与SCJP(Sun Certified Programmer for the Java Platform)认证相关的几个关键知识点,尤其是关于多线程、死锁以及异常处理的深入解析。 ### 多线程异常处理 #### 示例代码...

    很不错的SJCP题库

    其中可能的情况是当线程启动后,输出"run.",接着抛出异常"java.lang.RuntimeException:Problem"。在多线程编程中,当线程执行到抛出异常的点时,会终止执行,其他线程继续运行。这题显示了在Java多线程中异常处理的...

    Java中sleep()与wait()的区别总结

    - `sleep()` 方法是 `java.lang.Thread` 类的一个静态方法,它可以直接作用于当前正在执行的线程。 - `wait()` 方法是 `java.lang.Object` 类的一个实例方法,它需要作用于一个特定的对象,使得调用该方法的线程...

    超级有影响力霸气的Java面试题大全文档

     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或...

Global site tag (gtag.js) - Google Analytics