try
{
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
我明白第一部分在做什麼。但是什麼是捕捉部分等待?就像執行這部分所需要的一樣。這種嘗試和捕捉方法有什麼作用?
try
{
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
我明白第一部分在做什麼。但是什麼是捕捉部分等待?就像執行這部分所需要的一樣。這種嘗試和捕捉方法有什麼作用?
每段代碼都由一個「線程」運行。您可以將其視爲專用於運行該特定代碼的小型虛擬處理器。
通過調用Thread.sleep()
方法,您將此線程置於WAITING
狀態一段時間。雖然WAITING
,線程不能做任何事情,特別是,它不能「聽到」來自其他線程的調用。
喚醒線程並讓其再次運行其代碼的唯一方法是向它發送中斷,這是一個非常強烈的信號。這是通過從另一個線程調用此線程的interrupt()
方法完成的。
當被喚醒時,線程再次進入RUNNING
狀態,但是向開發人員表明它早於預期被喚醒,它會拋出一個InterruptedException
,這是一個檢查異常。這就是爲什麼你必須抓住它並處理它。
如果InterruptedException
拋出(線程中斷可能會導致此)從try
塊將由catch
塊趕上,當你在catch塊定義,將打印的Exception
堆棧跟蹤。
如果線程被中斷,那麼它將拋出異常並將在catch
塊中捕獲。
sleep方法會暫停當前線程的執行,在您的情況下爲5000毫秒(5秒)。然而,此方法拋出必須被捕獲的InterruptedException。
因爲Thread#sleep()方法被定義爲在某些情況下拋出InterruptedException
,所以當發生這種確切的異常時,開發人員應該照顧它。這就是爲什麼需要catch
塊 - 持有它處理當一個線程在等待佔據了InterruptedException
public class InterruptedException
extends Exception
拋出,睡覺,或以其他方式在邏輯和 線程被中斷,之前或期間活動。 偶爾一個方法可能希望測試當前線程是否已經中斷 ,如果是,立即拋出這個異常。
最好的解釋是鑑於╠══HERE
你線程進入睡眠狀態,持續5秒。
如果另一個線程試圖喚醒此線程(中斷)。它將在異常塊中結束,並且您的堆棧跟蹤將被打印。
這是有關multithreaded applications。當你有參照,要麼implements Runnable
或extends 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();
}
}
順便說一句,這很可能是錯誤的方式來處理'InterruptedException'。 –