sleep()與interrupt()


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(),立即停止,但是可能會導致數據不同步,資源得不到回收等問題,所以已經被棄用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM