java – 调用Object类的wait()方法的异常

即使在通知当前线程之后,下面的代码也不会执行(使用此).

public synchronized void test() {
    String str = new String();
    try {
        System.out.println("Test1");
        this.wait();
        this.notifyAll();
        System.out.println("Test2");
    } catch (Exception e) {
        // Todo Auto-generated catch block
        System.out.println("Inside exception");
        e.printstacktrace();
    }
 }

我只在控制台上输出Test1作为输出.

在第二种情况下,如果我在字符串对象上调用wait方法,我会得到异常.原因是因为字符串类对象str没有锁定当前对象.但我想知道str.wait()实际意味着什么?

public synchronized void test() {
    String str = "ABC";
    try {
        System.out.println("Test1");
        str.wait();
        str.notifyAll();
        System.out.println("Test2");
    } catch (Exception e) {
        // Todo Auto-generated catch block
        System.out.println("Ins");
        e.printstacktrace();
    }
 }

控制台输出

> Test1  
java.lang.IllegalMonitorStateException

解决方法

不确定您对该代码的期望:

>在你的第一个例子中,wait执行它所说的内容:它等待,因此从不调用notifyAll
>在第二个示例中,如果不先保存该对象的监视器,则无法在对象上调用wait.所以你需要在同步(str)块中以避免异常.但你仍然会遇到与1相同的问题.

等待和通知的主要用例是线程间通信,即一个线程等待,另一个线程通知等待线程可以唤醒.在您的情况下,相同的线程位于通信通道的两端,不起作用.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...