程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java start和run啟動線程的區別

Java start和run啟動線程的區別

編輯:JAVA編程入門知識

我們知道,我們通過調用線程的start方法啟動一個線程,那麼,我們可以直接調用run方法來啟動一個線程嗎?

  先看下面一段代碼:

 

[java] view plain copy  
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         // TODO Auto-generated method stub  
  4.         TestThread tt = new TestThread();  
  5.         tt.run();  
  6.     }  
  7. }  
  8.   
  9. class TestThread extends Thread {  
  10.     static int i = 0;  
  11.     final static int MAX_I = 10;  
  12.   
  13.     @Override  
  14.     public void run() {  
  15.         // TODO Auto-generated method stub  
  16.         while (i < MAX_I) {  
  17.             System.out.println(i++);  
  18.         }  
  19.     }  
  20. }  

 

  運行結果如下:

 

[java] view plain copy  
  1. 0  
  2. 1  
  3. 2  
  4. 3  
  5. 4  
  6. 5  
  7. 6  
  8. 7  
  9. 8  
  10. 9  

 

  或許有人會得出結論,這樣啟動一個線程是可以的,我們再對程式稍做修改,大家就會發現一個問題:

 

[java] view plain copy  
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         // TODO Auto-generated method stub  
  4.         TestThread tt = new TestThread();  
  5.         tt.run();  
  6.         System.out.println("Printed by main thread");  
  7.     }  
  8. }  
  9.   
  10. class TestThread extends Thread {  
  11.     static int i = 0;  
  12.     final static int MAX_I = 10;  
  13.   
  14.     @Override  
  15.     public void run() {  
  16.         // TODO Auto-generated method stub  
  17.         while (i < MAX_I) {  
  18.             System.out.println(i++);  
  19.         }  
  20.     }  
  21.   
  22. }  

 

  這裡只在主線程中加入了一行代碼,打印一行"Printed by main thread",運行代碼,結果如下:

 

[xhtml] view plain copy  
  1. 0  
  2. 1  
  3. 2  
  4. 3  
  5. 4  
  6. 5  
  7. 6  
  8. 7  
  9. 8  
  10. 9  
  11. Printed by main thread  

 

  熟練多線程開發的要發現問題了,為什麼"Printed by main thread"會打印在最後一行呢?TestThread類中一直持有時間段嗎?

  我們對上面的代碼進行分析,其實非常簡單,這只是一個普通的類中方法的調用,其實是一個單線程的執行,我們來修改代碼進一步驗證這一點:

 

[java] view plain copy  
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         // TODO Auto-generated method stub  
  4.         TestThread tt = new TestThread();  
  5.         tt.run();  
  6.         System.out.println(Thread.currentThread().getName());  
  7.         System.out.println("Printed by main thread");  
  8.     }  
  9. }  
  10.   
  11. class TestThread extends Thread {  
  12.     static int i = 0;  
  13.     final static int MAX_I = 10;  
  14.   
  15.     @Override  
  16.     public void run() {  
  17.         // TODO Auto-generated method stub  
  18.         System.out.println(Thread.currentThread().getName());  
  19.         while (i < MAX_I) {  
  20.             System.out.println(i++);  
  21.         }  
  22.     }  
  23. }  

 

  這段代碼分別在主線程和我們的TestThread的方法中打印當前線程名字,運行結果如下:

 

[xhtml] view plain copy  
  1. main  
  2. 0  
  3. 1  
  4. 2  
  5. 3  
  6. 4  
  7. 5  
  8. 6  
  9. 7  
  10. 8  
  11. 9  
  12. main  
  13. Printed by main thread  

 

  在TestThread類和主線程中運行的是同一個線程,說明在直接調用run時是不能使用多線程的,那麼把上面的run方法調用改為start方法的調動再看一下:

 

[java] view plain copy  
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         // TODO Auto-generated method stub  
  4.         TestThread tt = new TestThread();  
  5.         tt.start();  
  6.         System.out.println(Thread.currentThread().getName());  
  7.         System.out.println("Printed by main thread");  
  8.     }  
  9. }  
  10.   
  11. class TestThread extends Thread {  
  12.     static int i = 0;  
  13.     final static int MAX_I = 10;  
  14.   
  15.     @Override  
  16.     public void run() {  
  17.         // TODO Auto-generated method stub  
  18.         System.out.println(Thread.currentThread().getName());  
  19.         while (i < MAX_I) {  
  20.             System.out.println(i++);  
  21.         }  
  22.     }  
  23. }  

 

  運行結果如下:

 

[xhtml] view plain copy  
  1. main  
  2. Thread-0  
  3. 0  
  4. 1  
  5. 2  
  6. 3  
  7. 4  
  8. 5  
  9. 6  
  10. 7  
  11. 8  
  12. Printed by main thread  
  13. 9  

 

  很明顯,這才是我們想看到的結果,所以結論是只有調用Thread的start方法,將線程交由JVM控制,才能產生多線程,而直接調用run方法只是一個普通的單線程程式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved