sleep():
1)sleep是Thread類的靜態方法(Thread.sleep(1000),讓線程指定時間休眠,進入阻塞狀態。
2)sleep其實就是告訴系統在這段時間不要給該線程分配時間片了,讓出CPU的時間片給別的線程,這就給了其他比該線程優先級低的線程執行的機會,也同樣給同級或者更好級的線程執行的機會。
3)sleep一定要捕獲異常,因為在線程阻塞的時候,其他對象很有可能調用了其interrupt(),產生InterruptedException異常,如果不去捕獲異常,那么線程就會異常終止。
簡單代碼:
public class Threaddemo {
public static void main(String[] args) {
Runner2 r = new Runner2();
//啟動線程
r.start();
//主線程會休眠10秒鍾再執行以下的程序,在休眠的過程中r線程每隔1秒打印一次,10秒之后,調用了r的interript,這時r線程拋出InterruptedException異常,return。
try
{
Thread.sleep(10000);
}catch (InterruptedException e) {
}
//中斷線程
r.interrupt();
}
}
class Runner2 extends Thread{
public void run() {
while (true) {
System.out.println("------");
/**
* sleep必須捕獲異常
* sleep()必須捕獲異常,在sleep的過程中過程中有可能被其他對象調用它的interrupt(),
* 產生InterruptedException異常,如果你的程序不捕獲這個異常,線程就會異常終止,
* 進入TERMINATED狀態,如果你的程序捕獲了這個異常,
* 那么程序就會繼續執行catch語句塊(可能還有finally語句塊)以及以后的代碼。
*/
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
return;
}
}
}
}
interrupt()
1)首先要強調的是,interrupt()方法被調用后,不會立即中斷當前的線程,需要自己去監聽中斷狀態,這個中斷狀態是通過InterruptedException拋出異常來監聽的,當線程調用interrupt()方法,該線程就會捕獲異常,這時就處於中斷狀態,這樣受阻塞的線程就會推出阻塞狀態,中斷當前線程。例如以上程序,當主線程調用了r.interrupt(),這時線程並沒有結束,r線程會拋出InterruptedException異常,然后中斷線程。
2)只有線程處於wait、sleep、join三種阻塞狀態之一時,interrupt()方法才起作用,否則只有等執行了wait()、join()、sleep()之后,才會拋出InterruptedException異常。
其他中斷方法
1)正常中斷,線程按照正常邏輯走完,也就停止了線程。
2)stop強制停止,Thread.stop(),立即停止,但是可能會導致數據不同步,資源得不到回收等問題,所以已經被棄用。