天天看點

線程狀态(java層面)轉換解析

線程狀态轉換

線程狀态(java層面)轉換解析

假設有線程t

情況1

NEW --> RUNNABLE

  • 當調用

    t.start()

    方法時,由

    NEW --> RUNNABLE

情況2

RUNNBALE <--> WAITING

t線程 用

synchronized(obj)

擷取了對象鎖後

  • 調用

    obj.wait()

    方法時,t線程從

    RUNNABLE --> WAITING

  • 調用

    obj.notify()

    obj.notifyAll()

    t.interrupt()

    • 競争鎖成功,t線程從

      WAITING --> RUNNABLE

    • 競争鎖失敗,t線程從

      WAITING --> BLOCKED

情況3

RUNNBALE <--> WAITING

  • 目前線程調用

    t.join()

    方法時,目前線程從

    RUNNABLE --> WAITING

    • 注意目前線程是在t線程對象的螢幕上等待
  • t線程運作結束,或調用了目前線程的

    interrupt()

    時, 目前線程從

    WAITING --> RUNNABLE

情況4

RUNNBALE <--> WAITING

  • 目前線程調用

    LockSupport.park()

    方法會讓目前線程從

    RUNNABLE --> WAITING

  • 調用

    LockSupport.unpark(目标線程)

    或調用了線程的interrupt(),會讓目标線程從

    WAITING --> RUNNABLE

情況5

RUNNBALE <--> TIMED_WAITING

t 線程用

synchronized(obj)

擷取了對象鎖後

  • 調用

    obj.wait(long n)

    方法時,t 線程從

    RUNNABLE --> TIMED_WAITING

  • t 線程等待時間超過了 n 毫秒,或調用

    obj.notify()

    obj.notifyAll()

    t.interrupt()

    • 競争鎖成功,t 線程從

      TIMED_WAITING --> RUNNABLE

    • 競争鎖失敗,t 線程從

      TIMED_WAITING --> BLOCKED

情況6

RUNNBALE <--> TIMED_WAITING

  • 目前線程調用 t.join(long n) 方法時,目前線程從

    RUNNABLE --> TIMED_WAITING

    • 注意是目前線程在t 線程對象的螢幕上等待
  • 目前線程等待時間超過了 n 毫秒,或t 線程運作結束,或調用了目前線程的 interrupt() 時,目前線程從

    TIMED_WAITING --> RUNNABLE

情況7

RUNNBALE <--> TIMED_WAITING

  • 目前線程調用

    Thread.sleep(long n)

    ,目前線程從

    RUNNABLE --> TIMED_WAITING

  • 目前線程等待時間超過了 n 毫秒,目前線程從

    TIMED_WAITING --> RUNNABLE

情況8

RUNNBALE <--> TIMED_WAITING

  • 目前線程調用

    LockSupport.parkNanos(long nanos)

    LockSupport.parkUntil(long millis)

    時,目前線程從

    RUNNABLE --> TIMED_WAITING

  • 調用

    LockSupport.unpark(目标線程)

    或調用了線程 的

    interrupt()

    ,或是等待逾時,會讓目标線程從

    TIMED_WAITING--> RUNNABLE

情況 9

RUNNABLE <--> BLOCKED

  • t 線程用

    synchronized(obj)

    擷取了對象鎖時如果競争失敗,從

    RUNNABLE --> BLOCKED

  • 持 obj 鎖線程的同步代碼塊執行完畢,會喚醒該對象上所有

    BLOCKED

    的線程重新競争,如果其中 t 線程競争成功,從

    BLOCKED --> RUNNABLE

    ,其它失敗的線程仍然

    BLOCKED

情況 10

RUNNABLE <--> TERMINATED

目前線程所有代碼運作完畢,進入

TERMINATED

在這裡插入圖檔描述