當JVM加載代碼,發現main方法以後,就會啓動一個線程,這個線程稱爲「主線程」(main線程),該線程負責執行main方法。那麼在main方法執行中再建立的其餘線程就稱爲程序中的其餘線程。java
若是main方法中又建立了其餘線程,那麼JVM就要在主線程和其餘線程之間輪流切換,保證每一個線程都有機會使用CPU資源,main方法即便執行完最後的語句(主線程結束),JVM也不會結束java應用程序,JVM必定要等到Java應用程序中的全部線程都結束以後,才結束java應用程序。spa
java語言使用Thread類及其子類的對象來表示線程,新建的線程在它的一個完整的生命週期中一般要經歷以下的四種狀態。線程
1.新建code
當一個Thread類或其子類的對象被聲明並建立時,新生的線程對象處於新建狀態。此時它已經有了相應的內存空間和其餘資源。對象
2.運行blog
線程建立以後就具有了運行的條件,一旦輪到它來享用CPU資源時,即JVM將CPU使用權切換給該線程時,此線程就能夠脫離建立它的主線程獨立開始本身的生命週期。生命週期
線程建立後僅僅是佔有了內存資源,在JVM管理的線程中尚未這個線程,此線程必須調用start()方法通知JVM,這樣JVM就會知道又有一個新線程排隊等候切換了。隊列
當JVM將CPU使用權切換給線程時,若是線程是Thread的子類建立的,該類中的run()方法就當即執行,run()方法規定了該線程的具體使命。因此程序必須在子類中重寫父類的run()方法,Thread類中的run()方法沒有具體內容。內存
在沒有結束run()方法前,不要讓線程再調用start()方法,不然會發生IIlegalThreadStateException異常。資源
3.中斷
有四種緣由的中斷。
4.死亡
處於死亡狀態的線程不具備繼續運行的能力。
線程死亡的緣由有二,一個是正常運行的線程完成了它的所有工做,即執行完run()方法中的所有語句,結束了run()方法;另外一個緣由是線程被強制性地終止,即強制run()方法結束。所謂死亡就是線程釋放了實體,即釋放分配給線程對象的內存。
代碼展現以下所示:
public class Test05 { public static void main(String[] args) { // TODO Auto-generated method stub SpeakElephant speakElephant; SpeakCar speakCar; speakElephant = new SpeakElephant(); speakCar = new SpeakCar(); speakElephant.start(); speakCar.start(); for(int i = 1; i <= 15; i++) { System.out.print("主人" + i + " "); } } }
SpeakCar.java
public class SpeakCar extends Thread{ public void run() { for(int i = 0; i <= 20; i++) { System.out.print("轎車"+ i + " "); } } }
SpeakElephant.java
public class SpeakElephant extends Thread{ public void run() { for(int i = 0; i <= 20; i++) { System.out.print("大象" + i + " "); } } }
運行結果以下所示:
並且每次運行的結果都不同,
線程調度與優先級
處於就緒的線程首先進入就緒隊列等候CPU資源,同一時刻在就緒隊列中的線程可能有不少個。Java虛擬機中的線程調度器負責管理線程,調度器把線程的優先級分爲10個級別,分別用Thread類中的類常量表示。每一個Java線程的優先級都在常數1和10之間。若是沒有明確地設置好線程的優先級別,每一個線程的優先級別都爲常數5.
線程的優先級經過setPriority(int grade)方法調整,若是參數不在1和10之間,那麼會產生異常。