一個線程對象生成 後,若是要產生一個執行的線程,就必定要調用它的start()方法.在介紹這個方法時不得不一樣時說明run方法.其實線程對 象的run方法徹底是一個接口回調方法,它是你這個線程對象要完成的具體邏輯.簡單說你要作什麼就你在run中完成,而如何作,何時作就不須要你控制 了,你只要調用start()方法,JVM就會管理這個線程對象讓它產生一個線程並註冊到線程處理系統中。程序員
從表面上看,start()方法調用了run()方法,事實上,start()方法並無直接調用run方法.在JDK1.5之前 start()方法是本地方法,它如何最終調用run方法已經不是JAVA程序員所能瞭解的.而在JDK1.5中,原來的那個本地start()方法被 start0()代替,另個一個純JAVA的start()中調用本地方法start0(),而在start()方法中作了一個驗證,就是對一個全局變量 (對象變量)started作檢驗,若是爲true,則start()拋出異常,不會調用本地方法start0(),不然,先將該變量設有true,而後 調用start0()。安全
從中咱們能夠看到這個爲了控制一個線程對象只能運行成功一次start()方法.這是由於線程的運行要獲取當前環境,包括安全,父線程的權限, 優先級等條件,若是一個線程對象能夠運行屢次,那麼定義一個static 的線程在一個環境中獲取相應權限和優先級,運行完成後它在另外一個環境中利用原來的權限和優先級等屬性在當前環境中運行,這樣就形成沒法預知的結果.簡單說 來,讓一個線程對象只能成功運行一次,是基於對線程管理的須要。併發
start()方法最本質的功能是從CPU中申請另外一個線程空間來執行 run()方法中的代碼,它和當前的線程是兩條線,在相對獨立的線程空間運行,也就是說,若是你直接調用線程對象的run()方法,固然也會執行,但那是 在當前線程中執行,run()方法執行完成後繼續執行下面的代碼.而調用start()方法後,run()方法的代碼會和當前線程併發(單CPU)或並行 (多CPU)執行。spa
因此請記住一句話:調用線程對象的run方法不會產生一個新的線程,雖然能夠達到相同的執行結果,但執行過程和執行效率不一樣。線程