溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java線程沒有Running狀態的原因

發布時間:2021-06-12 09:22:15 來源:億速云 閱讀:738 作者:小新 欄目:編程語言

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

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

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

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

Java線程沒有Running狀態的原因

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

  • NEW

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

  • RUNNABLE

在Java虛擬機中執行的線程處于這種狀態

  • BLOCKED

正在等待鎖的阻塞線程處于這種狀態。

  • WAITING

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

  • TIMED_WAITING

在指定的等待時間內等待另一個線程執行某個操作的線程處于這種狀態。該狀態不同于WAITING,它可以在指定的時間后自行返回。

  • TERMINATED

已經退出的線程處于這種狀態。

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

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

線程之間的狀態是可以互相轉換的,如下圖:

Java線程沒有Running狀態的原因

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

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

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

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

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

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

Java線程沒有Running狀態的原因

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

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

為什么沒有定義RUNNING狀態?

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

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

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

Java線程沒有Running狀態的原因

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

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

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

因為當我們看到線程是RUNNING狀態的時候,很有可能他已經丟失了CPU時間片了。

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

就是他的狀態是可執行的,只要獲得時間片,就能立即執行。

那這不就是RUNNABLE嗎?

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

Java線程沒有Running狀態的原因Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

Java線程沒有Running狀態的原因

以上是“Java線程沒有Running狀態的原因”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女