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