您好,登錄后才能下訂單哦!
本篇內容介紹了“Java線程的生命周期是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Java的線程生命周期有六種狀態:
New(初始化狀態)
Runnable(可運行/運行狀態)
Blocked(阻塞狀態)
Waiting(無時間限制的等待狀態)
Timed_Waiting(有時間限制的等待狀態)
Terminated(終止狀態)
1.New(初始化狀態):指的是在高級語言,比如Java。在Java層面的線程被創建了,而在操作系統中的線程其實是還沒被創建的,所以這個時候是不可能分配CPU執行這個線程的!所以這個狀態是高級語言獨有的,操作系統的線程沒這個狀態。我們New了一個線程,那時候它就是這個狀態。
2.Runnable(可運行/運行狀態):這個狀態下是可以分配CPU執行的,在New狀態時候我們調用start()方法后線程就處于這個狀態。
3.Blocked(阻塞狀態):這個狀態下是不能分配CPU執行的,只有一種情況會導致線程阻塞,就是synchronized!我們知道被synchronized修飾的方法或者代碼塊同一時刻只能有一個線程執行,而其他競爭鎖的線程就從Runnable到了Blocked狀態!當某個線程競爭到鎖了它就變成了Runnable狀態。
注意并發包中的Lock,是會讓線程屬于等待狀態而不是阻塞,只有synchronized是阻塞。(感覺是歷史遺留問題,沒必要多一個阻塞狀態和等待沒差啊)
4.Waiting(無時間限制的等待狀態):這個狀態下也是不能分配CPU執行的。有三種情況會使得Runnable狀態到waiting狀態
1.調用無參的Object.wait()方法。等到notifyAll()或者notify()喚醒就會回到Runnable狀態。
2.調用無參的Thread.join()方法。也就是比如你在主線程里面建立了一個線程A,調用A.join(),那么你的主線程是得等A執行完了才會繼續執行,這是你的主線程就是等待狀態。
3.調用LockSupport.park()方法。LockSupport是Java6引入的一個工具類Java并發包中的鎖都是基于它實現的,再調用LocakSupport.unpark(Thread thread),就會回到Runnable狀態。
5.Timed_Waiting(有時間限制的等待狀態):其實這個狀態和Waiting就是有沒有超時時間的差別,這個狀態下也是不能分配CPU執行的。有五種情況會使得Runnable狀態到waiting狀態。
Object.wait(long timeout)。
Thread.join(long millis)。
Thread.sleep(long millis)。注意Thread.sleep(long millis, int nanos) 內部調用的其實也是Thread.sleep(long millis)。
LockSupport.parkNanos(Object blocked,long deadline)。
LockSupport.parkUntil(long deadline)。
6.Terminated(終止狀態):在我們的線程正常run結束之后或者run一半異常了就是終止狀態!
注意有個方法Thread.stop()是讓線程終止的,但是這個方法已經被廢棄了,不推薦使用,因為比如你這個線程得到了鎖,你stop了之后這個鎖也隨著沒了,其它線程就都拿不到這個鎖了!這不玩完了么!所以推薦使用interrupt()方法。
interrupt()會使得線程Waiting和Timed_Waiting狀態的線程拋出 interruptedException異常,使得Runnabled狀態的線程如果是在I/O操作會拋出其它異常。
如果Runnabled狀態的線程沒有阻塞在I/O狀態的話,那只能主動檢測自己是不是被中斷了,使用isInterrupted()。
“Java線程的生命周期是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。