2014-01-30 26 views
1
try 
{ 
    Thread.sleep(5000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

我明白第一部分在做什麼。但是什麼是捕捉部分等待?就像執行這部分所需要的一樣。這種嘗試和捕捉方法有什麼作用?

+3

順便說一句,這很可能是錯誤的方式來處理'InterruptedException'。 –

回答

1

每段代碼都由一個「線程」運行。您可以將其視爲專用於運行該特定代碼的小型虛擬處理器。

通過調用Thread.sleep()方法,您將此線程置於WAITING狀態一段時間。雖然WAITING,線程不能做任何事情,特別是,它不能「聽到」來自其他線程的調用。

喚醒線程並讓其再次運行其代碼的唯一方法是向它發送中斷,這是一個非常強烈的信號。這是通過從另一個線程調用此線程的interrupt()方法完成的。

當被喚醒時,線程再次進入RUNNING狀態,但是向開發人員表明它早於預期被喚醒,它會拋出一個InterruptedException,這是一個檢查異常。這就是爲什麼你必須抓住它並處理它。

0

如果InterruptedException拋出(線程中斷可能會導致此)從try塊將由catch塊趕上,當你在catch塊定義,將打印的Exception堆棧跟蹤。

0

如果線程被中斷,那麼它將拋出異常並將在catch塊中捕獲。

1

sleep方法會暫停當前線程的執行,在您的情況下爲5000毫秒(5秒)。然而,此方法拋出必須被捕獲的InterruptedException。

1

因爲Thread#sleep()方法被定義爲在某些情況下拋出InterruptedException,所以當發生這種確切的異常時,開發人員應該照顧它。這就是爲什麼需要catch塊 - 持有它處理當一個線程在等待佔據了InterruptedException

1
public class InterruptedException 
extends Exception 

拋出,睡覺,或以其他方式在邏輯和 線程被中斷,之前或期間活動。 偶爾一個方法可能希望測試當前線程是否已經中斷 ,如果是,立即拋出這個異常。

最好的解釋是鑑於╠══HERE

1

你線程進入睡眠狀態,持續5秒。

如果另一個線程試圖喚醒此線程(中斷)。它將在異常塊中結束,並且您的堆棧跟蹤將被打印。

0

這是有關multithreaded applications。當你有參照,要麼implements Runnableextends Thread,而且對象的內部,一個Thread.sleep(i)方法一直空轉過程中的類的對象,你可以調用該參考reference.interupt(),它會觸發InterruptedException。這裏有一個例子:

在下面的代碼中,Scratch類的run方法進入睡眠狀態60000毫秒(或1分鐘),並打印「我已經打斷了:」如果它收到一個InterruptedExection。代碼寫入的方式不會收到此異常,並且會一直處於睡眠狀態。但是,第二次運行//scratch.interrupt();時,不要註釋行,看看會發生什麼。

package scratch; 
/** 
* 
* @author bstidham 
*/ 
public class Scratch extends Thread { 

    public void run() { 
     System.out.println("Hello from a thread!"); 
     System.out.println("Going to sleep for 1 minute..."); 
     try { 
      Thread.sleep(60000); 
     } catch (InterruptedException e) { 
      System.out.println("I've been interrupted!"); 
     } 
     System.out.println("Awake now"); 
    } 

    public static void main(String args[]) { 
     Scratch scratch = new Scratch(); 
     scratch.start(); 
     //scratch.interrupt(); 
    } 
}