1. 程式人生 > >執行緒靜態方法sleep()詳解以及喚醒執行緒方法interrupt

執行緒靜態方法sleep()詳解以及喚醒執行緒方法interrupt

//java多執行緒中的sleep方法,這是一個手動給執行緒加阻塞的一個方法,當呼叫sleep方法後執行緒從執行到阻塞等阻塞時間過後到就緒狀態。sleep是一個靜態方法因此直接通過Thread呼叫他與執行緒物件名無關。

//下面程式碼中有一個注意點:在main方法中有一句t1.sleep(2000),是t1執行緒啟動後2s才執行嗎?不是,這裡就要注意因為sleep是一個靜態方法,因此和執行緒物件是無關的,要看他現在在哪個棧記憶體中,也就是看他當前在哪個執行緒中,很明顯他現在主執行緒中,主執行緒呼叫類中的main方法,所以也就是當t1.start()後,t1執行緒已經開始執行,當2s後執行主執行緒中的輸出語句“Hello world”所以見程式碼:

package ThreadTest;

class Processor06 implements Runnable{
	@Override
	public void run() {		//注意run方法不丟擲異常,所以覆寫的run方法不丟擲異常
		// TODO Auto-generated method stub
		for(int i=0; i<20; i++){
			System.out.println(Thread.currentThread().getName() + "-->" + i);
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

public class ThreadTest06 {

	public static void main(String[] args) throws InterruptedException  {
		Thread t1 = new Thread(new Processor06());
		t1.setName("t1");
		t1.start();
		t1.sleep(2000);		
			//這裡要注意sleep是一個靜態方法通過Thread直接呼叫的跟t1這個類無關,寫的時候應該Thread.sleep()
		System.out.println("Hello world");
	}
}

//執行截圖,因為t1執行緒我設定的是1s阻塞一次,也就是1s獲得一個時間片,那麼2s後執行Hello world 

//下面是喚醒執行緒的方法interrupt

package ThreadTest;

class Processor07 implements Runnable{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Thread.sleep(10000000000000L);
			System.out.println("Sleep is end");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		for(int i=0; i<20; i++){
			System.out.println(Thread.currentThread().getName() + "-->" + i);
		}
	}
}

public class ThreadTest07 {
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(new Processor07());
		t1.setName("t1");
		t1.start();
		Thread.sleep(5000);
		t1.interrupt();
	}
}