1.線程的sleep()方法
static void sleep(Long millis)
* (1)靜態方法
* (2)參數是毫秒
* (3)作用是讓當前線程進入休眠,即進入“阻塞狀態”,放棄占有CPU時間片,讓給其他線程使用,代碼出現在A線程中,A線程就休眠,出現在B中,B就休眠
1 package XianChengFenXi; 2 3 /* 4 * 線程的sleep()方法 5 * static void sleep(Long millis) 6 * 1.靜態方法:Thread.sleep(1000) 7 * 2.參數是毫秒 8 * 3.作用是讓當前線程進入休眠,即進入“阻塞狀態”,放棄占有CPU時間片,讓給其他線程使用。代碼出現在A線程中,A線程就休眠,出現在B中,B就休眠
* 4.Thread.sleep()方法可以用來:間隔特定的時間,去執行一段特定的代碼,每隔多久執行一次 9 */ 10 public class ThreadTest6 { 11 12 public static void main(String[] args){ 13 //讓當前線程進入休眠,睡眠5秒鍾 14 //當前線程是主線程 15 try { 16 Thread.sleep(1000*5); 17 } catch (InterruptedException e) { 18 // TODO Auto-generated catch block 19 e.printStackTrace(); 20 } 21 22 //5秒后執行這里的代碼 23 System.out.println("hello world!!!"); 24 } 25 26 }
------------------------------------------------------------------------
1 package XianChengFenXi; 2 3 public class ThreadTest6 { 4 5 public static void main(String[] args){ 6 7 for(int i=0;i<10;i++){ 8 System.out.println(Thread.currentThread().getName()+"---------"+i); 9 try { 10 Thread.sleep(1000); //睡眠一秒鍾 11 } catch (InterruptedException e) { 12 // TODO Auto-generated catch block 13 e.printStackTrace(); 14 } 15 } 16 17 18 } 19 20 21 22 }
2.關於Thread.sleep()方法的面試題
1 package XianChengFenXi; 2 3 4 5 /* 6 * 關於Thread.sleep()方法的面試題 7 */ 8 public class ThreadTest7 { 9 10 public static void main(String[] args){ 11 //創建線程對象 12 MyThread3 t=new MyThread3(); 13 t.setName("t"); 14 t.start(); 15 16 //調用sleep方法 17 try { 18 //問題:這行代碼是否會讓t線程進入休眠? 19 /* 20 不會,這個方法是個靜態方法,與t沒有關系,在執行的時候會轉換成Thread.sleep(1000*5),而這個方法是讓當前線程進行休眠 21 而它在main里面,所以會讓main線程進行休眠,而不是讓分支線程進入休眠 22 */ 23 t.sleep(1000*5); 24 } catch (InterruptedException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 29 System.out.println("hello world!!"); 30 } 31 32 } 33 34 class MyThread3 extends Thread{ 35 public void run(){ 36 for(int i=0;i<10000;i++){ 37 System.out.println(Thread.currentThread().getName()+"------->"+i); 38 } 39 } 40 }
3.喚醒
1 package XianChengFenXi; 2 3 4 /* 5 * sleep睡眠太久,如果希望半路上醒來,該怎么辦,即如何喚醒正在睡眠的線程? 6 */ 7 8 public class ThreadTest8 { 9 10 public static void main(String[] args){ 11 12 Thread t=new Thread(new MyRunnable2()); 13 t.setName("t"); 14 t.start(); 15 //希望5秒后,t線程醒來 16 try { 17 Thread.sleep(1000*5); 18 } catch (InterruptedException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 } 22 23 //將t線程喚醒,這種中斷睡眠的方式,依靠了java的異常處理方式,這里一執行,第39行代碼即讓線程睡眠一年的代碼就會報異常,然后進入catch,接着整個try catch執行完畢 24 t.interrupt(); 25 } 26 27 } 28 29 class MyRunnable2 implements Runnable{ 30 public void run(){ 31 System.out.println(Thread.currentThread().getName()+"-------->begin"); 32 33 /* 34 * 注:這里不能采用拋出異常,因為作為子類的MyRunnable2 不能拋出比父類更多的異常,即子類重寫父類的方法,子類不能拋出比父類更寬泛的異常 35 * 所以run()方法中的異常不能throws只能try catch,因為run()方法在父類中沒有拋出異常,而子類拋出的異常不能大於等於父類。 36 */ 37 try { 38 //睡一年 39 Thread.sleep(1000*60*60*24*365); 40 } catch (InterruptedException e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 } 44 45 System.out.println(Thread.currentThread().getName()+"-------->end"); 46 } 47 }
運行結果:

