摘要:如果發生了動作,則會從等待池當中喚醒一個線程重新恢復到狀態,如果是操作,則喚醒所有等待線程。當時間達到時觸發線程回到工作狀態。線程終止狀態線程結束了,就處于這種狀態,也就是方法運行完了。線程狀態切換詳細圖線程狀態源碼
線程狀態 (1)NEW(新建尚未運行/啟動)
還沒調用start,或者調用了start()方法,不一定立即改變線程狀態,中間可能需要一些步驟才完成一個線程的啟動。
(2)RUNNABLE(處于可運行狀態:正在運行或準備運行)start調用結束,線程由NEW變成RUNNABLE,存活著,并嘗試占用CPU資源,yield操作時,線程還是Runnable狀態,只是它有一個細節的內部變化,做一個簡單的讓步。在Java層面是Runnable的狀態,并不代表一定處于運行中的狀態,比如BIO中,線程正阻塞在網絡等待的時候,看到的狀態依然是Runnable狀態,而底層線程已經被阻塞住了。
(3)BLOCKED(等待獲取鎖時進入的狀態)線程被掛起了,原因通常是因為它在等待一個鎖,當某個synchronized正好有線程在使用時,一個線程嘗試進入這個臨界區,就會被阻塞,直到另一個線程走完臨界區或發生了相應鎖對象的wait操作后,它才有機會去爭奪進入臨界區的權利。當搶到鎖之后,才會從blocked狀態恢復到runnable狀態。這個狀態它好像什么也不做一樣。
(4)WAITING(通過wait方法進入的等待)當wait,join,park方法調用時,進入waiting狀態。前提是這個線程已經擁有鎖了。
blocked和waiting狀態的區別是:
A、blocked是虛擬機認為程序還不能進入某個區域,因為同時進去就會有問題,這是一塊臨界區。
B、發生wait等操作的先決條件是要進入臨界區,也就是線程已經拿到鎖了,自己可能進去做了一些事情,但此時通過判定業務上的參數,發現還有一些其他配合的資源沒有準備充分,那么自己就等等再做其他事情。
在waiting狀態下,如果發生了interrupt操作,則處于該狀態的線程在內部會拋出一個InterruptedException,這個異常應當在run方法內捕獲,使得run方法正常地執行完成,當然捕獲異常后,是決定讓線程繼續運行,還是結束等要根據業務場景才處理。
如果發生了notify動作,則會從等待池當中喚醒一個線程重新恢復到Runnable狀態,如果是notifyall操作,則喚醒所有等待線程。
(5)TIMED_WAITING(通過sleep或wait timeout方法進入的限期等待的狀態)通過wait(t),sleep(t),join(t),parkNanos,parkUntil等方法進入此狀態。當時間達到時觸發線程回到工作狀態Runnable。
interrupt只對處于waiting或timed_waiting狀態的線程起作用,對其他狀態不起作用。
(6)TERMINATED(線程終止狀態)線程結束了,就處于這種狀態,也就是run方法運行完了。這只是Java語言級別的一種狀態,在操作系統內部可能已經注銷了相應的線程,或者將它復用給其他需要使用線程的請求。
線程狀態切換詳細圖
線程狀態源碼/** * A thread state. A thread can be in one of the following states: *
* A thread can be in only one state at a given point in time. * These states are virtual machine states which do not reflect * any operating system thread states. * * @since 1.5 * @see #getState */ public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */ RUNNABLE, /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a synchronized block/method or * reenter a synchronized block/method after calling * {@link Object#wait() Object.wait}. */ BLOCKED, /** * Thread state for a waiting thread. * A thread is in the waiting state due to calling one of the * following methods: *
A thread in the waiting state is waiting for another thread to * perform a particular action. * * For example, a thread that has called Object.wait() * on an object is waiting for another thread to call * Object.notify() or Object.notifyAll() on * that object. A thread that has called Thread.join() * is waiting for a specified thread to terminate. */ WAITING, /** * Thread state for a waiting thread with a specified waiting time. * A thread is in the timed waiting state due to calling one of * the following methods with a specified positive waiting time: *
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65814.html
摘要:上下文切換會影響到線程的執行速度,對于系統來說意味著會消耗大量的時間減少上下文切換的方式無鎖并發編程,在多線程競爭鎖時,會導致大量的上下文切換。線程在中的使用在中實現多線程的方式比較簡單,因為中提供了非常方便的來實現多線程。 文章簡介 上一篇文章我們了解了進程和線程的發展歷史、線程的生命周期、線程的優勢和使用場景,這一篇,我們從Java層面更進一步了解線程的使用 內容導航 并發編程的...
摘要:應用性能優化是一個程序員必須要考慮的問題,典型的性能問題如頁面響應慢接口超時,服務器負載高并發數低,數據庫頻繁死鎖等。診斷對于主要關注平均負載,使用率,上下文切換次數。應用診斷及工具應用代碼性能問題是相對好解決的一類性能問題。 Java 應用性能優化是一個程序員必須要考慮的問題,典型的性能問題如頁面響應慢、接口超時,服務器負載高、并發數低,數據庫頻繁死鎖等。Java應用性能的瓶頸點非常...
摘要:多線程一線程模型實現線程有三種方式使用內核線程實現使用用戶線程實現和使用用戶線程加輕量級進程混合實現。這種輕量級進程與內核線程之間的關系稱為一對一的線程模型。是通知所有等待對象控制權的線程繼續運行。 Java多線程 一、Java線程模型 實現線程有三種方式:使用內核線程實現、使用用戶線程實現和使用用戶線程加輕量級進程混合實現。內核線程是直接由操作系統內核支持的線程,通過內核完成線程切換...
摘要:本文是從視角理解系統結構連載文章在高性能編程時經常接觸到多線程起初我們的理解是多個線程并行地執行總比單個線程要快就像多個人一起干活總比一個人干要快然而實際情況是多線程之間需要競爭設備或者競爭鎖資源,導致往往執行速度還不如單個線程在這里有一個 本文是從Java視角理解系統結構連載文章 在高性能編程時,經常接觸到多線程. 起初我們的理解是, 多個線程并行地執行總比單個線程要快, 就像多個...
摘要:如問到是否使用某框架,實際是是問該框架的使用場景,有什么特點,和同類可框架對比一系列的問題。這兩個方向的區分點在于工作方向的側重點不同。 [TOC] 這是一份來自嗶哩嗶哩的Java面試Java面試 32個核心必考點完全解析(完) 課程預習 1.1 課程內容分為三個模塊 基礎模塊: 技術崗位與面試 計算機基礎 JVM原理 多線程 設計模式 數據結構與算法 應用模塊: 常用工具集 ...
閱讀 3337·2021-11-22 14:44
閱讀 2542·2019-08-30 14:10
閱讀 2601·2019-08-30 13:12
閱讀 1222·2019-08-29 18:36
閱讀 1345·2019-08-29 16:16
閱讀 3334·2019-08-26 10:33
閱讀 1766·2019-08-23 18:16
閱讀 383·2019-08-23 18:12