一 概述多線程
一個進程只有一個至少會運行一個線程,Java中一樣存在這樣,在調用main方法的時候,線程又JVM所建立。併發
1 package link.summer7c.test; 2 3 public class Test{ 4 public static void main(String[] args){ 5 System.out.println(Thread.currentThread().getName()); 6 } 7 }
運行結果:mainide
叫作main的線程正在執行main()方法中的代碼。可是main和main方法並無什麼關係,只是由於名字相近而已。spa
二 Java多線程的實現操作系統
Java的JDK中,實現多線程有兩種方法,一種是繼承Thread類,另外一種是實現Runnable接口。線程
繼承Thread方法:code
1 package link.summer7c.test; 2 3 public class Test extends Thread{ 4 public void run(){ 5 super.run(); 6 System.out.println("The Test!"); 7 } 8 public static void main(String[] args){ 9 Test test=new Test(); 10 test.start(); 11 System.out.println(Thread.currentThread().getName()); 12 } 13 }
運行結果:對象
main
The Test!blog
按照程序來看,應該先輸出The Test。在輸出main,可是結果卻不是如此這就說明在運行多線程的時候運行結果和代碼的順序是沒有關係的。繼承
因此,線程是一個子任務,CPU是以不肯定的方式來執行的。
而後再看看Thread的源代碼:
1 public class Thread implements Runnable
說明Thread類實現了Runnable類,他們之間有多態關係。
驗證線程的隨機性能夠在運行兩個線程,同時循環輸出,則會發現兩個線程並非順序執行:
1 package link.summer7c.test; 2 3 public class Test{ 4 public static void main(String[] args){ 5 MyThread myThread=new MyThread(); 6 myThread.setName("MyThreadRun"); 7 myThread.start(); 8 for(int i=0;i<10;i++){ 9 System.out.println("main="+Thread.currentThread().getName()); 10 } 11 } 12 } 13 14 class MyThread extends Thread{ 15 public void run(){ 16 for(int i=0;i<10;i++){ 17 System.out.println("run="+Thread.currentThread().getName()); 18 } 19 } 20 }
結果:
main=main run=MyThreadRun run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main
start方法不是啓動程序的方法,全部的start是併發執行的。
實現Runnable接口:
1 package link.summer7c.test; 2 3 public class Test{ 4 public static void main(String[] args){ 5 Runnable myThread=new MyThread(); 6 Thread theThread=new Thread(myThread); 7 theThread.start(); 8 System.out.println("Main Run!"); 9 } 10 } 11 12 class MyThread implements Runnable{ 13 @Override 14 public void run() { 15 System.out.println("線程運行!"); 16 } 17 18 }
從這裏能夠看出來,實現了Runnable接口以後仍是要new一個Thread對象,這裏我很疑惑,既然Runnable是多線程的接口爲何沒有start方法呢,接下來我看了源碼:public
interface Runnable {
public abstract void run();
}
原來Runnable接口中沒有start,因此start的方法是在Thread中寫出來的,因此我又看了Thread的源代碼,發現了start方法。
1 start0();
在strat方法中調用了start0方法,這個方法是這樣寫的:
private native void start0();
能夠看出,這個方法已經涉及到了操做系統的接口了,極可能是用C/C++寫出來的,這裏就不深刻探究了。
=========================================