執行緒靜態方法sleep()詳解以及喚醒執行緒方法interrupt
阿新 • • 發佈:2019-01-11
//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(); } }