在这里,我在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
块不是强制性的。(请参见上文。(