我们为什么要在try块中使用wait()方法?我们可以在try块之外使用wait()方法吗?

时间:2017-06-25 03:10:28

标签: java multithreading

这里我在try块中使用wait()方法来进行线程之间的相互通信。我在try块之外使用了wait方法,但它显示异常。

try
{
    System.out.println(" why we should use wait() method in try block  ");
    wait();
}
    catch()
    {
    }
}

1 个答案:

答案 0 :(得分:3)

  

问:我们为什么要在try块中使用wait()方法?

您在wait()块或synchronized方法中使用synchronized

synchronized (this) {
    while (!this.isTeapot) {
        this.wait();
    }
    System.out.println("I am a teapot");
}

另一种方法......

synchronized (this) {
    this.isTeapot = true;
    this.notify();
}        

为什么呢?

  • 因为规范是这样说的。
  • 因为如果你没有,你会得到IllegalMonitorStateException

但为什么?

  • 因为没有此限制,无法安全地实施等待/通知条件变量。该要求对于螺纹安全至关重要;即避免竞争条件和记忆异常。

try块不是必需的。如果您需要处理该级别的 ,请使用try块。如果没有,请允许它传播。这包括InterruptedException ...虽然因为它是一个经过检查的异常,如果你没有在本地捕获它,你需要在方法的throws子句中声明它。但这只是普通的Java异常处理。没什么特别的。

例如:

try {
    synchronized (this) {
        while (!this.isTeapot) {
            this.wait();
        }
        System.out.println("I am a teapot");
    }
} catch (InterruptedException ex) {
    Thread.currentThread().interrupt();
}

(有关上述示例的说明,请参阅Why would you catch InterruptedException to call Thread.currentThread.interrupt()?。)

  

问:我们可以在try块外使用wait()方法吗?

您无法在wait()阻止或synchronized方法之外呼叫synchronized。 (见上文。)

try块不是必需的。 (见上文。)