在任何程序運行時,都少不了線程的參與,線程編寫的是否精良,同時決定了程序的好壞,下面我們一起學習下線程的基本知識。
1.什麼是線程?
線程是一個程序的多個執行路徑,執行調度的單位,依托於進程存在。 線程不僅可以共享進程的內存,而且還擁有一個屬於自己的內存空間,這段內存空間也叫做線程棧,是在建立線程時由系統分配的,主要用來保存線程內部所使用的數據,如線程執行函數中所定義的變量。
2.線程怎麼來使用?
定義一個線程(Defining a Thread)有兩種方法
1) 繼承java.lang.Thread類
package thread;
public class Test002 extends Thread{
public static void main(String[] args) {
Thread th = new Thread();
th.start();
}
@Override
public void run() {
}
}
其中,th是一個線程,但千萬要記住,main也是一個線程,所有的程序中都有main線程。同時要注意:重寫(override)run()方法在該線程的start()方法被調用後,JVM會自動調用run方法來執行任務;但是重載(overload)run()方法,該方法和普通的成員方法一樣,並不會因調用該線程的start()方法而被JVM自動運行。不建議使用此方法定義線程,因為采用繼承Thread的方式定義線程後,你不能在繼承其他的類了,導致程序的可擴展性大大降低。
2) 實現java.lang.Runnable接口
package thread;
public class Test003 implements Runnable{
Test003 test = new Test003();
Thread th = new Thread(test);
@Override
public void run() {
}
}
3.線程的狀態
新生狀態(New): 當一個線程的實例被創建即使用new關鍵字和Thread類或其子類創建一個線程對象後,此時該線程處於新生(new)狀態,處於新生狀態的線程有自己的內存空間,但該線程並沒有運行,此時線程還不是活著的(not alive);
就緒狀態(Runnable): 通過調用線程實例的start()方法來啟動線程使線程進入就緒狀態(runnable);處於就緒狀態的線程已經具備了運行條件,但還沒有被分配到CPU即不一定會被立即執行,此時處於線程就緒隊列,等待系統為其分配CPCU,等待狀態並不是執行狀態;此時線程是活著的(alive);
運行狀態(Running): 一旦獲取CPU(被JVM選中),線程就進入運行(running)狀態,線程的run()方法才開始被執行;在運行狀態的線程執行自己的run()方法中的操作,直到調用其他的方法而終止、或者等待某種資源而阻塞、或者完成任務而死亡;如果在給定的時間片內沒有執行結束,就會被系統給換下來回到線程的等待狀態;此時線程是活著的(alive);
阻塞狀態(Blocked):通過調用join()、sleep()、wait()或者資源被暫用使線程處於阻塞(blocked)狀態;處於Blocking狀態的線程仍然是活著的(alive)
死亡狀態(Dead):當一個線程的run()方法運行完畢或被中斷或被異常退出,該線程到達死亡(dead)狀態。此時可能仍然存在一個該Thread的實例對象,當該Thready已經不可能在被作為一個可被獨立執行的線程對待了,線程的獨立的call stack已經被dissolved。一旦某一線程進入Dead狀態,他就再也不能進入一個獨立線程的生命周期了。對於一個處於Dead狀態的線程調用start()方法,會出現一個運行期(runtime exception)的異常;處於Dead狀態的線程不是活著的(not alive)。
線程的狀態圖:
好了 今天就和大家說道這 拜拜!!