2017-06-25 52 views
1

這裏我使用try()方法中的wait()方法進行線程之間的相互通信。我在try塊外面使用了wait方法,但它顯示異常。爲什麼我們應該在try塊中使用wait()方法?我們可以在try塊外面使用wait()方法嗎?

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

如果您查看[Object#wait的JavaDocs](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait - ),你會看到它拋出兩個異常,'IllegalMonitorStateException',這是一個'RuntimeException'和'InterruptedException',這是一個被捕獲的異常,你必須處理,所以,不,你必須在' try-catch'或者拋出異常 – MadProgrammer

+0

正如@MadProgrammer所說的,你必須捕獲InterruptedException,或者你的方法需要聲明它拋出它 – okaram

+0

謝謝,它有很多幫助。 –

回答

3

問:爲什麼要使用wait()方法try塊內?

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

(比如上述例子中的解釋,見Why would you catch InterruptedException to call Thread.currentThread.interrupt()?

問:我們可以用wait()方法try塊外面?

你不能叫wait()外​​塊或​​方法。 (見上文)

try塊不是強制性的。 (參見上文)

+0

up !!!嗨,你可能需要寫一個簡單的例子。即g:同步方法拋出拋出「等待」的異常。 –

相關問題