線程(Thread)是併發編程的基礎,也是程序執行的最小單元,它依託進程而存在。一個進程中可以包含多個線程,多線程可以共享一塊內存空間和一組系統資源,因此線程之間的切換更加節省資源、更加輕量化,也因此被稱爲輕量級的進程。
當然,線程也是面試中常被問到的一個知識點,是程序員必備的基礎技能,使用它可以有效地提高程序的整體運行速度。
本課時的面試問題是,線程的狀態有哪些?它是如何工作的?
典型回答
線程的狀態在 JDK 1.5 之後以枚舉的方式被定義在 Thread 的源碼中,它總共包含以下 6 個狀態:
NEW,新建狀態,線程被創建出來,但尚未啓動時的線程狀態;
RUNNABLE,就緒狀態,表示可以運行的線程狀態,它可能正在運行,或者是在排隊等待操作系統給它分配 CPU 資源;
BLOCKED,阻塞等待鎖的線程狀態,表示處於阻塞狀態的線程正在等待監視器鎖,比如等待執行 synchronized 代碼塊或者使用 synchronized 標記的方法;
WAITING,等待狀態,一個處於等待狀態的線程正在等待另一個線程執行某個特定的動作,比如,一個線程調用了 Object.wait() 方法,那它就在等待另一個線程調用 Object.notify() 或 Object.notifyAll() 方法;
TIMED_WAITING,計時等待狀態,和等待狀態(WAITING)類似,它只是多了超時時間,比如調用了有超時時間設置的方法 Object.wait(long timeout) 和 Thread.join(long timeout) 等這些方法時,它纔會進入此狀態;
TERMINATED,終止狀態,表示線程已經執行完成。
線程狀態的源代碼如下:
public enum State {
/**
* 新建狀態,線程被創建出來,但尚未啓動時的線程狀態
*/
NEW,
/**
* 就緒狀態,表示可以運