为什么我们应该在尝试块内使用wait()方法?我们可以在try块之外使用wait()方法吗?

  • 本文关键字:wait 方法 我们 try java multithreading
  • 更新时间 :
  • 英文 :


在这里,我在try block中使用wait((方法,用于线程之间的交流。我在try块之外使用了等待方法,但是显示出例外。

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

问:为什么我们应该在尝试块内使用wait((方法?

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

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();
}

(有关上述示例的说明,请参阅为什么要捕获InterruptedException以调用thread.currentthread.interrupt((?。(

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

您无法在synchronized块或synchronized方法外调用wait()。(请参见上文。(

try块不是强制性的。(请参见上文。(

最新更新