review33

當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.中斷

有四種緣由的中斷。

  • JVM將CPU資源從當前線程切換給其餘線程,使本線程讓出CPU的使用權處於中斷狀態。
  • 線程使用CPU資源期間,執行了sleep(int millsecond)方法,使當前線程進入休眠狀態。sleep(int millsecond)方法是Thread類的一個類方法,線程一旦執行了sleep(int millsecond)方法,就馬上讓出CPU的使用權,使當前線程處於中斷狀態。通過參數millsecond指定的毫秒以後,該線程就從新進到線程隊列中排隊等待CPU資源,以便從中斷出繼續運行。
  • 線程使用CPU資源期間,執行了wait()方法,使得當前線程進入等待狀態。
  • 線程使用CPU資源期間,執行某個操做進入阻塞狀態,好比執行讀/寫操做引發阻塞。進入阻塞狀態時線程不能進入排隊隊列,只有當引發阻塞的緣由消除時,線程才從新進到線程隊列中排隊等待CPU資源。

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之間,那麼會產生異常。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息