Java線程沒有Running狀態(tài)的原因

小編給大家分享一下Java線程沒有Running狀態(tài)的原因,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為黃梅等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及黃梅網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、黃梅網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

在多線程操作系統(tǒng)中,通常是在一個(gè)進(jìn)程中包括多個(gè)線程,每個(gè)線程都是作為利用CPU的基本單位,是花費(fèi)最小開銷的實(shí)體。

線程是有狀態(tài)的,線程的狀態(tài)被定義在Thread.State枚舉中,在Java Doc中也有明確的解釋:

Java線程沒有Running狀態(tài)的原因

通過查看源碼以及閱讀Java Doc,我們可以知道,線程主要有以下6種狀態(tài):

  • NEW

當(dāng)一個(gè)線程被創(chuàng)建出來的,但是還沒調(diào)用start()方法的時(shí)候,他處于NEW狀態(tài)。

  • RUNNABLE

在Java虛擬機(jī)中執(zhí)行的線程處于這種狀態(tài)

  • BLOCKED

正在等待鎖的阻塞線程處于這種狀態(tài)。

  • WAITING

不確定地等待另一個(gè)線程執(zhí)行某個(gè)特定操作的線程就是處于這種狀態(tài),進(jìn)入該狀態(tài)的線程需要等待其他線程做出一些特定動(dòng)作(通知或中斷)。

  • TIMED_WAITING

在指定的等待時(shí)間內(nèi)等待另一個(gè)線程執(zhí)行某個(gè)操作的線程處于這種狀態(tài)。該狀態(tài)不同于WAITING,它可以在指定的時(shí)間后自行返回。

  • TERMINATED

已經(jīng)退出的線程處于這種狀態(tài)。

在指定的時(shí)間點(diǎn),線程只能處于一種狀態(tài)。但是需要注意的是這些狀態(tài)表示的是虛擬機(jī)中線程的狀態(tài),而不是任何操作系統(tǒng)線程狀態(tài)。

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

線程之間的狀態(tài)是可以互相轉(zhuǎn)換的,如下圖:

Java線程沒有Running狀態(tài)的原因

上圖,就是線程的6種狀態(tài)的轉(zhuǎn)換圖,當(dāng)遇到不同的操作或者事件的時(shí)候,線程的狀態(tài)就可能發(fā)生變化。

Java  Doc中說在Java虛擬機(jī)中正在執(zhí)行的線程處于RUNNABLE狀態(tài),但是,在操作系統(tǒng)層面,一個(gè)線程要想被執(zhí)行,是需要獲得CPU的使用權(quán)的。

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

我們其實(shí)還可以把RUNNABLE狀態(tài)進(jìn)一步細(xì)化一下,根據(jù)線程是否獲得了CPU的使用權(quán)分成兩種:

就緒(READY):線程對(duì)象創(chuàng)建后,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中并分配cpu使用權(quán)  。

運(yùn)行中(RUNNING):就緒(READY)的線程獲得了cpu 時(shí)間片,開始執(zhí)行程序代碼。

Java線程沒有Running狀態(tài)的原因

也就是說,當(dāng)一個(gè)線程被創(chuàng)建出來之后,執(zhí)行了start方法之后,在沒有獲得cpu的使用權(quán)的時(shí)候,他就是就緒狀態(tài)(READY),在獲得了CPU的使用權(quán),開始執(zhí)行的時(shí)候,就是運(yùn)行狀態(tài)(RUNNING)了。

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

為什么沒有定義RUNNING狀態(tài)?

對(duì)于現(xiàn)在的分時(shí)操作系統(tǒng)來說,在單CPU情況下,所有的線程其實(shí)都是串行執(zhí)行的。但是為了讓我們看起來像是在并發(fā)執(zhí)行,人們把CPU的執(zhí)行分成很多個(gè)小的時(shí)間片。

哪個(gè)進(jìn)程得到時(shí)間片,那個(gè)線程就執(zhí)行,時(shí)間片到了之后,就要釋放出CPU,再重新進(jìn)行爭(zhēng)搶時(shí)間片。

只要把時(shí)間片劃分的足夠細(xì),那么多個(gè)程序雖然在不斷的串行執(zhí)行,但是看起來也像是在同時(shí)執(zhí)行一樣。

Java線程沒有Running狀態(tài)的原因

那么,CPU的時(shí)間片其實(shí)是很短的,一般也就是10-20毫秒左右。

那么,也就是說,在一秒鐘之內(nèi),同一個(gè)線程可能一部分時(shí)間處于READY狀態(tài)、一部分時(shí)間處于RUNNING狀態(tài)。

那么如果,明確的給線程定義出RUNNING狀態(tài)的話,有一個(gè)很大的問題,就是這個(gè)狀態(tài)其實(shí)是不準(zhǔn)的。

因?yàn)楫?dāng)我們看到線程是RUNNING狀態(tài)的時(shí)候,很有可能他已經(jīng)丟失了CPU時(shí)間片了。

對(duì)于線程的狀態(tài),我們只需要知道,他當(dāng)前有沒有在"正在參與執(zhí)行"就行了,何為"參與執(zhí)行"?

就是他的狀態(tài)是可執(zhí)行的,只要獲得時(shí)間片,就能立即執(zhí)行。

那這不就是RUNNABLE嗎?

所以,Java就沒有給線程定義RUNNING狀態(tài),而是定義了一個(gè)RUNNABLE狀態(tài)。

Java線程沒有Running狀態(tài)的原因Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

Java線程沒有Running狀態(tài)的原因

以上是“Java線程沒有Running狀態(tài)的原因”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

文章名稱:Java線程沒有Running狀態(tài)的原因
URL分享:http://muchs.cn/article38/ghsgpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、App開發(fā)定制開發(fā)、小程序開發(fā)、動(dòng)態(tài)網(wǎng)站外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)