線程有哪些狀態?每個狀態是什麼意思?又是如何切換的?

先聲明一下水印問題,一開始公衆號是叫午茶電影,後面我又改了個名字,但是在寫這篇文章的時候,還是原來那個名字,這絕對不是轉載的,因爲你搜wuchastory公衆號,就能搜到我這個。

線程大家都有在使用,但是有時候也僅僅是使用,對它的一些行爲還不是特別的瞭解,今天就來和大家談談線程的狀態這個內容。

首先線程有哪些狀態呢?

這個問題,我們可以從Java的源代碼中找到的答案,先簡單粗暴,直接貼上代碼,看看線程的狀態有哪些:
在這裏插入圖片描述

看完了,大家也知道了,線程有6個狀態。

這6個狀態分別是:New, Runnable, Blocked, Waiting, Timed_Waiting, Terminated.

分別是什麼意思呢?咱們一一來解釋,其實說起來也簡單。

New:這個狀態呢,就是線程對象創建之後、啓動之前,就是這個狀態。

用代碼來說呢,就是
在這裏插入圖片描述

這個New狀態很好理解。

Runnable: 當調用start方法後呢,線程就會進入Runnable狀態,表示,我這個線程可以被執行了,如果調度器給這個線程分配了CPU時間,那麼這個線程就可以被執行,這裏一定要正確區分一下Runnable不是說正在執行,而是可以被執行,這兩個還是有區別的。
在這裏插入圖片描述

Blocked: 這個狀態,當線程要進入臨界區的時候,會發生。比如說,前面有一個臨界區的代碼需要執行,那麼線程就會進入這個狀態,如果只有一個線程呢,那麼也就只有它一個在進入臨界區了,它就會進入臨界區開始執行,隨後轉爲Runnable狀態。如果有多個線程到了臨界區,那麼都會進入Blocked狀態,由調度器選一個來執行,如果這個線程執行完畢後,大家還是一同爲Blocked狀態,調度器再選一個來執行。

在這裏插入圖片描述

所以很有可能發生的情況是,選了A線程執行,BCD都在等着,A執行完了後,還是偏心的選了A線程執行。

Waiting: waiting狀態,當你調用了wait,join方法後,就會進入這個狀態。一旦進入到這個狀態,CPU就不會管你了,直到有別的線程通過notify方法將它喚起,否則的話,就會一直在等待中。設計這個狀態怎麼用呢?我的理解是,線程A需要完成一些事情,但是這些事情必須要滿足某些條件才能繼續,因此,如果我寫一個死循環在這裏等待,就很優雅了(浪費CPU資源),這時就可以使用這個waiting狀態,條件未滿足前,我進入waiting狀態,等條件滿足了,別人來通知我,我在繼續執行。
在這裏插入圖片描述

Timed_Waiting: 這個狀態也是等待,但是是有一個計時器在裏面,最常見的是使用Thread.sleep方法觸發,觸發後,線程就進入了Timed_waiting狀態,隨後會由計時器觸發,再進入Runnable狀態。

在這裏插入圖片描述
Terminated: 終結狀態,當線程的所有代碼都被執行完畢後,會進入到這個狀態,這個就是字面意思了。

總的來說,狀態切換如下圖所示了:

在這裏插入圖片描述

可見,幾個重要狀態的切換都是從Runnable轉換出去,再轉換回來的

然而……

在這裏插入圖片描述

咱們還是得實踐一把,才能整明白啊,光紙上談兵咋行呢。於是我就憑空捏造了一個需求:

有一個4*50的二維數組,用4個線程去分5個階段去填滿它,也就說,第一階段大家一起填0-9,當大家都填滿了0-9,再一起去填10-19,以此類推,先填滿的線程要等着其他線程都填好了,再繼續。

這樣就能看到4個線程爭先恐後的填數組,跑得快的還得先等着跑得慢的,然後大家再繼續跑第二階段。

在這裏插入圖片描述

這裏直接放上效果圖(下面是GIF,會動的):
在這裏插入圖片描述

代碼放在github上了,如需自取:https://github.com/krossford/algorithm/blob/master/java/src/thread/TestThreadStatus.java

最後,如果你喜歡我的文章,歡迎大家關注我的微信公衆號:好奇碼農君
關注了之後,就可以在手機上隨時查看我的文章了喲
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章