Java基礎學習備忘錄(連載之:線程的生命週期)

疑難困惑備忘錄之:線程的生命週期問題。併發

  • 線程:操做系統可以進行運算調度的最小單位
  • Java線程的生命週期,即:線程的生老病死
  • 六種狀態:
    • New(初始化狀態)
      • 在Java層面,線程被建立了;而在操做系統中,線程實際上是還沒被建立
      • 這個時候是不可能分配CPU執行這個線程的
      • 這個狀態是高級語言獨有的,操做系統的線程沒這個狀態
      • 咱們New一個線程,這時候它就是這個狀態
    • Runnable(可運行/運行狀態)
      • 可分配CPU執行
      • 在New狀態時,調用start()方法後線程就處於這個狀態
    • Blocked(阻塞狀態)
      • 不能分配CPU執行的
      • 只有一種狀況會致使線程阻塞,就是synchronized
      • 被synchronized修飾的方法或者代碼塊同一時刻只能有一個線程執行,而其餘競爭鎖的線程就從Runnable到了Blocked狀態
      • 當某個線程競爭到鎖了它就變成了Runnable狀態。
      • 併發包中的Lock,是會讓線程屬於等待狀態而不是阻塞,只有synchronized是阻塞
    • Waiting(無時間限制的等待狀態)
      • 不能分配CPU執行
      • 有三種狀況會使得Runnable狀態到waiting狀態
        1. 調用無參的Object.wait()方法
        2. 調用無參的Thread.join()方法
        3. 調用LockSupport.park()方法
    • Timed_Waiting(有時間限制的等待狀態)
      • 和Waiting就是有沒有超時時間的差異
      • 不能分配CPU執行的
      • 有五種狀況會使得Runnable狀態到waiting狀態
        1. Object.wait(long timeout)
        2. Thread.join(long millis)
        3. Thread.sleep(long millis)
        4. LockSupport.parkNanos(Object blocked,long deadline)
        5. LockSupport.parkUntil(long deadline)
    • Terminated(終止狀態)
      • 線程正常run結束以後或者run一半異常了就是終止狀態

線程的生命週期

  • 方法Thread.stop()(已廢棄,如:這個線程獲得了鎖,stop以後這個鎖也隨着沒了,其它線程就都拿不到這個鎖;推薦使用interrupt())是讓線程終止的操作系統

  • interrupt()會使得線程Waiting和Timed_Waiting狀態的線程拋出interruptedException異常,使得Runnabled狀態的線程若是是在I/O操做會拋出其它異常線程

  • 若Runnabled狀態的線程沒有阻塞在I/O狀態的話,那隻能主動檢測本身是否是被中斷了,使用isInterrupted()。cdn

本文已收錄至個人我的博客,歡迎交流:www.swaggyhang.com/blog

相關文章
相關標籤/搜索