線程的sleep()方法


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 }

運行結果:


免責聲明!

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



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