<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          漫話:如何給女朋友解釋為什么Java線程沒有Running狀態(tài)?

          共 1719字,需瀏覽 4分鐘

           ·

          2021-06-07 23:18

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

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

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

          • NEW

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

          • RUNNABLE

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

          • BLOCKED

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

          • WAITING

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

          • TIMED_WAITING

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

          • TERMINATED

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

          因為當我們看到線程是RUNNING狀態(tài)的時候,很有可能他已經(jīng)丟失了CPU時間片了。

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

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

          那這不就是RUNNABLE嗎?

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

          關于作者漫話編程,是一個通過漫畫+音頻的形式講解枯燥的編程知識的公眾號。致力于讓編程變得更有樂趣。


          推薦閱讀:


          喜歡我可以給我設為星標哦

          好文章,我“在看”
          瀏覽 49
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲AV无码成人精品国产网站 | www精品 | 爱爱视频美日韩 | 国产一级爱 | 青青草视频手机华人 |