run 方法 也能夠調用線程啓動 可是單線程(爲順序執行)html
而start方法 啓動的線程爲多個線程之間爭奪cpu的執行權(爲隨機的)java
摘錄於 http://www.cnblogs.com/sunflower627/p/4816821.html多線程
Java的線程是經過java.lang.Thread類來實現的。VM啓動時會有一個由主方法所定義的線程。能夠經過建立Thread的實例來建立新的線程。每一個線程都是經過某個特定Thread對象所對應的方法run()來完成其操做的,方法run()稱爲線程體。經過調用Thread類的start()方法來啓動一個線程。併發
在Java當中,線程一般都有五種狀態,建立、就緒、運行、阻塞和死亡:
第一是建立狀態。在生成線程對象,並無調用該對象的start方法,這是線程處於建立狀態。
第二是就緒狀態。當調用了線程對象的start方法以後,該線程就進入了就緒狀態,可是此時線程調度程序尚未把該線程設置爲當前線程,此時處於就緒狀態。在線程運行以後,從等待或者睡眠中回來以後,也會處於就緒狀態。
第三是運行狀態。線程調度程序將處於就緒狀態的線程設置爲當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。
第四是阻塞狀態。線程正在運行的時候,被暫停,一般是爲了等待某個事件的發生(好比說某項資源就緒)以後再繼續運行。sleep,suspend,wait等方法均可以致使線程阻塞。
第五是死亡狀態。若是一個線程的run方法執行結束或者調用stop方法後,該線程就會死亡。對於已經死亡的線程,沒法再使用start方法令其進入就緒。函數
實現並啓動線程有兩種方法:
一、寫一個類繼承自Thread類,重寫run方法。用start方法啓動線程
二、寫一個類實現Runnable接口,實現run方法。用new Thread(Runnable target).start()方法來啓動spa
多線程原理:至關於玩遊戲機,只有一個遊戲機(cpu),但是有不少人要玩,因而,start是排隊!等CPU選中你就是輪到你,你就run(),當CPU的運行的時間片執行完,這個線程就繼續排隊,等待下一次的run()。線程
調用start()後,線程會被放到等待隊列,等待CPU調度,並不必定要立刻開始執行,只是將這個線程置於可動行狀態。而後經過JVM,線程Thread會調用run()方法,執行本線程的線程體。先調用start後調用run,這麼麻煩,爲了避免直接調用run?就是爲了實現多線程的優勢,沒這個start不行。code
1.start()方法來啓動線程,真正實現了多線程運行。這時無需等待run方法體代碼執行完畢,能夠直接繼續執行下面的代碼;經過調用Thread類的start()方法來啓動一個線程, 這時此線程是處於就緒狀態, 並無運行。 而後經過此Thread類調用方法run()來完成其運行操做的, 這裏方法run()稱爲線程體,它包含了要執行的這個線程的內容, Run方法運行結束, 此線程終止。而後CPU再調度其它線程。
2.run()方法看成普通方法的方式調用。程序仍是要順序執行,要等待run方法體執行完畢後,纔可繼續執行下面的代碼; 程序中只有主線程——這一個線程, 其程序執行路徑仍是隻有一條, 這樣就沒有達到寫線程的目的。
記住:多線程就是分時利用CPU,宏觀上讓全部線程一塊兒執行 ,也叫併發htm
package basic; public class ThreadTest { public static void main(String[] args) { Runner1 runner1 = new Runner1(); Runner2 runner2 = new Runner2(); // Thread(Runnable target) 分配新的 Thread 對象。 Thread thread1 = new Thread(runner1); Thread thread2 = new Thread(runner2); thread1.start(); //執行start,thread1與thread2交叉執行 thread2.start(); //thread1.run(); //執行run,thread1與thread2順序執行 //thread2.run(); } } class Runner1 implements Runnable { // 實現了Runnable接口,jdk就知道這個類是一個線程 public void run() { for (int i = 0; i < 100; i++) { System.out.println("進入Runner1運行狀態——————————" + i); } } } class Runner2 implements Runnable { // 實現了Runnable接口,jdk就知道這個類是一個線程 public void run() { for (int i = 0; i < 100; i++) { System.out.println("進入Runner2運行狀態==========" + i); } } }