国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

線程有哪些狀態(tài)?每個(gè)狀態(tài)是什么意思?又是如何切換的?

isLishude / 2309人閱讀

摘要:終結(jié)狀態(tài),當(dāng)線程的所有代碼都被執(zhí)行完畢后,會進(jìn)入到這個(gè)狀態(tài),這個(gè)就是字面意思了。

先聲明一下水印問題,一開始公眾號是叫午茶電影,后面我又改了個(gè)名字,但是在寫這篇文章的時(shí)候,還是原來那個(gè)名字,這絕對不是轉(zhuǎn)載的,因?yàn)槟闼褀uchastory公眾號,就能搜到我這個(gè)。

線程大家都有在使用,但是有時(shí)候也僅僅是使用,對它的一些行為還不是特別的了解,今天就來和大家談?wù)劸€程的狀態(tài)這個(gè)內(nèi)容。

首先線程有哪些狀態(tài)呢?

這個(gè)問題,我們可以從Java的源代碼中找到的答案,先簡單粗暴,直接貼上代碼,看看線程的狀態(tài)有哪些:

看完了,大家也知道了,線程有6個(gè)狀態(tài)。

這6個(gè)狀態(tài)分別是:New, Runnable, Blocked, Waiting, Timed_Waiting, Terminated.

分別是什么意思呢?咱們一一來解釋,其實(shí)說起來也簡單。

New:這個(gè)狀態(tài)呢,就是線程對象創(chuàng)建之后、啟動之前,就是這個(gè)狀態(tài)。

用代碼來說呢,就是

這個(gè)New狀態(tài)很好理解。

Runnable: 當(dāng)調(diào)用start方法后呢,線程就會進(jìn)入Runnable狀態(tài),表示,我這個(gè)線程可以被執(zhí)行了,如果調(diào)度器給這個(gè)線程分配了CPU時(shí)間,那么這個(gè)線程就可以被執(zhí)行,這里一定要正確區(qū)分一下Runnable不是說正在執(zhí)行,而是可以被執(zhí)行,這兩個(gè)還是有區(qū)別的。

Blocked: 這個(gè)狀態(tài),當(dāng)線程要進(jìn)入臨界區(qū)的時(shí)候,會發(fā)生。比如說,前面有一個(gè)臨界區(qū)的代碼需要執(zhí)行,那么線程就會進(jìn)入這個(gè)狀態(tài),如果只有一個(gè)線程呢,那么也就只有它一個(gè)在進(jìn)入臨界區(qū)了,它就會進(jìn)入臨界區(qū)開始執(zhí)行,隨后轉(zhuǎn)為Runnable狀態(tài)。如果有多個(gè)線程到了臨界區(qū),那么都會進(jìn)入Blocked狀態(tài),由調(diào)度器選一個(gè)來執(zhí)行,如果這個(gè)線程執(zhí)行完畢后,大家還是一同為Blocked狀態(tài),調(diào)度器再選一個(gè)來執(zhí)行。

所以很有可能發(fā)生的情況是,選了A線程執(zhí)行,BCD都在等著,A執(zhí)行完了后,還是偏心的選了A線程執(zhí)行。

Waiting: waiting狀態(tài),當(dāng)你調(diào)用了wait,join方法后,就會進(jìn)入這個(gè)狀態(tài)。一旦進(jìn)入到這個(gè)狀態(tài),CPU就不會管你了,直到有別的線程通過notify方法將它喚起,否則的話,就會一直在等待中。設(shè)計(jì)這個(gè)狀態(tài)怎么用呢?我的理解是,線程A需要完成一些事情,但是這些事情必須要滿足某些條件才能繼續(xù),因此,如果我寫一個(gè)死循環(huán)在這里等待,就很優(yōu)雅了(浪費(fèi)CPU資源),這時(shí)就可以使用這個(gè)waiting狀態(tài),條件未滿足前,我進(jìn)入waiting狀態(tài),等條件滿足了,別人來通知我,我在繼續(xù)執(zhí)行。

Timed_Waiting: 這個(gè)狀態(tài)也是等待,但是是有一個(gè)計(jì)時(shí)器在里面,最常見的是使用Thread.sleep方法觸發(fā),觸發(fā)后,線程就進(jìn)入了Timed_waiting狀態(tài),隨后會由計(jì)時(shí)器觸發(fā),再進(jìn)入Runnable狀態(tài)。

Terminated: 終結(jié)狀態(tài),當(dāng)線程的所有代碼都被執(zhí)行完畢后,會進(jìn)入到這個(gè)狀態(tài),這個(gè)就是字面意思了。

總的來說,狀態(tài)切換如下圖所示了:

可見,幾個(gè)重要狀態(tài)的切換都是從Runnable轉(zhuǎn)換出去,再轉(zhuǎn)換回來的

然而……

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

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

這樣就能看到4個(gè)線程爭先恐后的填數(shù)組,跑得快的還得先等著跑得慢的,然后大家再繼續(xù)跑第二階段。

這里直接放上效果圖(下面是GIF,會動的):


代碼放在github上了,如需自取:https://github.com/krossford/...

如果大家喜歡我的文章,請關(guān)注我新開的公眾號:好奇碼農(nóng)君
微信公眾號:好奇碼農(nóng)君

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75861.html

相關(guān)文章

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<