java - 调用 Object 类的 wait() 方法时出现异常

标签 java oop

<分区>

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

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

最佳答案

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

  1. 在您的第一个示例中,wait 执行它所说的操作:它等待,因此永远不会调用 notifyAll
  2. 在第二个例子中,你不能在一个对象上调用 wait 而不首先持有那个对象的监视器。所以你需要在 synchronized(str) block 中以避免异常。但是您仍然会遇到与 1 中相同的问题。

waitnotify 的主要用例是线程间通信,即一个线程等待,另一个线程通知等待线程可以唤醒。在您的情况下,相同的线程位于通信 channel 的两端,这是行不通的。

关于java - 调用 Object 类的 wait() 方法时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990016/

相关文章:

java - Mozilla Rhino 上的区域设置始终为法语(至少在法语平台上)

java - Selenium - 无法导入包 'org.openqa.selenium.environment'

c++ - 由比较器参数化的 STL 堆

python - 如何在 PyGame Snake 游戏中添加分数跟踪器?

java - ZK 在单个项目中使用多个 webapp

java - Jenkins 在构建和构建后之间挂起

Java继承概念

c++ - 为什么我不能在初始化列表中初始化静态变量?

python - 试图创建只读属性属性 - getter 返回初始化值,直接访问返回更改后的值

javascript - 在封装上揭示模块与对象文字模式