1. 程式人生 > >Java併發程式設計的藝術(四)——執行緒的狀態

Java併發程式設計的藝術(四)——執行緒的狀態

這裡寫圖片描述

執行緒的狀態

初始態:NEW

建立一個Thread物件,但還未呼叫start()啟動執行緒時,執行緒處於初始態。

執行態:RUNNABLE

在Java中,執行態包括就緒態 和 執行態。

  • 就緒態
    • 該狀態下的執行緒已經獲得執行所需的所有資源,只要CPU分配執行權就能執行。
    • 所有就緒態的執行緒存放在就緒佇列中。
  • 執行態
    • 獲得CPU執行權,正在執行的執行緒。
    • 由於一個CPU同一時刻只能執行一條執行緒,因此每個CPU每個時刻只有一條執行態的執行緒。

阻塞態

  • 當一條正在執行的執行緒請求某一資源失敗時,就會進入阻塞態。
  • 而在Java中,阻塞態專指請求鎖失敗時進入的狀態。
  • 由一個阻塞佇列存放所有阻塞態的執行緒。
  • 處於阻塞態的執行緒會不斷請求資源,一旦請求成功,就會進入就緒佇列,等待執行。

PS:鎖、IO、Socket等都資源。

等待態

  • 當前執行緒中呼叫wait、join、park函式時,當前執行緒就會進入等待態。
  • 也有一個等待佇列存放所有等待態的執行緒。
  • 執行緒處於等待態表示它需要等待其他執行緒的指示才能繼續執行。
  • 進入等待態的執行緒會釋放CPU執行權,並釋放資源(如:鎖)

超時等待態

  • 當執行中的執行緒呼叫sleep(time)、wait、join、parkNanos、parkUntil時,就會進入該狀態;
  • 它和等待態一樣,並不是因為請求不到資源,而是主動進入,並且進入後需要其他執行緒喚醒;
  • 進入該狀態後釋放CPU執行權 和 佔有的資源。
  • 與等待態的區別:到了超時時間後自動進入阻塞佇列,開始競爭鎖。

終止態

執行緒執行結束後的狀態。

執行緒狀態轉換圖

執行緒狀態圖

初始態——>就緒態

當執行緒物件呼叫start()方法時就會進入就緒態,若就緒佇列沒有執行緒,則直接進入執行態。

就緒態——>執行態

由系統呼叫完成。

就緒態<——執行態

  1. 呼叫Thread.yield()函式
  2. 由系統呼叫完成(當執行緒時間片用完)

執行態——>阻塞態

當執行緒請求鎖失敗時進入阻塞態。

阻塞態——>就緒態

阻塞佇列中的執行緒會不斷檢查鎖是否可用,一旦可用就進入就緒佇列。

執行態——>等待態

  1. 呼叫Object.wait()方法
    • wait方法必須在同步塊內部;
    • 必須由同步塊的鎖物件呼叫;
    • 必須由notify方法和wait方法必須由同一個鎖物件呼叫
  2. 呼叫Thread.join()方法
  3. 呼叫LockSupport.park()方法

等待態——>就緒態

某一個執行緒呼叫了 鎖物件.notify()方法,並且等待的執行緒並不需要鎖

等待態——>阻塞態

鎖物件.notify()方法,並且等待的執行緒需要鎖同步。

注意點

  • wait()方法會釋放CPU執行權 和 佔有的鎖。
  • sleep(long)方法僅釋放CPU使用權,鎖仍然佔用;執行緒被放入超時等待佇列,與yield相比,它會使執行緒較長時間得不到執行。
  • yield()方法僅釋放CPU執行權,鎖仍然佔用,執行緒會被放入就緒佇列,會在短時間內再次執行。
  • wait和notify必須配套使用,即必須使用同一把鎖呼叫;
  • wait和notify必須放在一個同步塊中
  • 呼叫wait和notify的物件必須是他們所處同步塊的鎖物件。

這裡寫圖片描述

相關推薦

java併發程式設計一一多執行執行安全()

##1.java重排序 ###1.1資料依賴性 如果兩個操作訪問同一個變數時,且這兩個操作匯中有一個為寫操作,此時這兩個操作之間就 存在資料依賴性。資料依賴分下列三種類型。 名稱 程式碼示例 說明

Java併發程式設計(01):執行的建立方式,狀態週期管理

> 本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent) # 一、併發程式設計簡介 ##

java併發程式設計實戰】—–執行基本概念

轉自 http://cmsblogs.com/?p=1638 共享和可變 要編寫執行緒安全的程式碼,其核心在於對共享的和可變的狀態進行訪問。 “共享”就意味著變數可以被多個執行緒同時訪問。我們知道系統中的資源是有限的,不同的執行緒對資源都是具有著同等的使用權。有限、公平就意味著競爭

java併發程式設計一一多執行之間通訊(一)

1.多執行緒之間如何實現通訊 多執行緒之間通訊,其實就是多個執行緒在操作同一個資源,但是操作的動作不同。 1.1什麼是多執行緒之間通訊? 需求:第一個執行緒寫入(input)使用者,另一個執行緒讀取(out)使用者。實現讀一個,寫一個操作。 1.2多執行緒之間通訊需求?

java併發程式設計一一多執行執行安全(三)

1.多執行緒的三大特性 1.1什麼是原子性 即一個操作或多個操作要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 一個很經典的例子就是銀行賬戶轉賬問題: 比如從賬戶A向賬戶B轉1000元,那麼必然包括2個操作:從賬戶A減去1000元,往賬戶B加上1000元。這2

java併發程式設計一一多執行執行安全(二)

1.多執行緒死鎖 1.1什麼是多執行緒死鎖? 同步中巢狀同步,導致鎖無法釋放 程式碼示例: class Thread009 implements Runnable { private int trainCount = 100; private Object

java併發程式設計一一多執行執行安全(一)

1.什麼是執行緒安全? 1.1為什麼有執行緒安全問題? 當多個執行緒同時共享同一個全域性變臉或靜態變數,做寫的操作時,可能會發生資料衝突的問題, 也就是執行緒安全的問題。但是做讀操作是不會發生資料衝突問題。 舉例:現在有100張火車票,有兩個視窗同時搶火車票,用多執行緒模擬搶

java併發程式設計一一多執行基礎快速入門

1.執行緒與程序的區別 每個正在系統上執行的程式都是一個程序。每個程序包含一到多個執行緒。執行緒是一組指令的集合,或者是程式的特殊段,他可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。 所以執行緒基本是輕量級的程序,它負責在單個程式裡執行任務。通常有作業系統負責多個執行緒

Java併發程式設計(5)-Executor執行排程框架解讀

文章目錄 一、Executor執行緒排程框架 1.1、什麼是執行緒排程框架 1.2、Executors 1.3、Executor 1.4、ExecutorService 1

Java併發程式設計(3)-構造執行安全類的模式

文章目錄 一、例項限制模式 1.1、 限制變數確保執行緒安全 1.2、分析ArrayList的執行緒安全性 1.3、總結 二、委託執行緒安全模式 2.

【架構】Java併發程式設計 - 深入剖析執行

前言 如果我們要使用執行緒的時候就去建立一個,這樣雖然非常簡便,但是就會有一個問題: 如果併發的執行緒數量很多,並且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。 那麼有沒有一種辦法使得執行緒可以複用

Java 併發程式設計深入學習——執行池及其實現原理

Java執行緒池介紹   執行緒池,從字面含義來看,是指管理一組同構工作執行緒的資源池。執行緒池是與工作佇列(work Queue)密切相關的,其中工作佇列中儲存了所有等待執行的任務。工作者執行緒(Work Thread)的任務很簡單:從工作佇列中獲取一個任務,執行任務,然

Java併發程式設計 之 HashMap執行不安全

我想在平時的多執行緒程式設計中,容器的使用是很普遍的,但是你有沒有考慮過有些容器是不安全的,如Haspmap、ArrayList。這裡講解一下Hashmap不安去體現在哪裡。 插入時不安全: 如果有兩個執行緒A和B,都進行插入資料,剛好經過雜湊計算後得到的雜湊碼是一樣的,即插入的

Java併發程式設計之深入執行池原理及實現

Java執行緒池在實際的應用開發中十分廣泛。雖然Java1.5之後在JUC包中提供了內建執行緒池可以拿來就用,但是這之前仍有許多老的應用和系統是需要程式設計師自己開發的。因此,基於執行緒池的需求背景、技術要求瞭解執行緒池原理和實現,一方面可以更為深刻理解Java多執行緒開發,有助於解決業務系統中因為執行緒問題

【4】Java併發程式設計:多執行中的快取一致性和CAS

一、匯流排鎖定和快取一致性 基本概念 這是兩個作業系統層面的概念。隨著多核時代的到來,併發操作已經成了很正常的現象,作業系統必須要有一些機制和原語,以保證某些基本操作的原子性,比如處理器需要保證讀一個位元組或寫一個位元組是原子的,那麼它是如何實現的呢?有

java併發程式設計實戰:執行安全性筆記

執行緒安全性 可以在多個執行緒中呼叫,並且線上程之間不會出現錯誤的互動。 原子性 原子性:即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 i++ 和 ++i就不是原子性。 ++i 讀取值,將值加1,將值寫入i.”讀取,修改,寫入

Java併發程式設計系列(一)-執行的基本使用

最近在學習java併發程式設計基礎.一切從簡,以能理解概念為主. 併發程式設計肯定繞不過執行緒.這是最基礎的. 那麼就從在java中,如何使用執行緒開始. 繼承Thread類 繼承Thread類,重寫run方法,new出物件,呼叫start方法. 在新啟的執行緒裡執行的就是重寫的run方法. 1 /**

java併發程式設計(對於執行內共享變數安全的思考)

        上一篇部落格講解了,多個執行緒之間的互斥和同步的操作,一個是利用了鎖的技術;另一個內則是利用了Object的notify和wait來實現同步操作。這篇部落格呢,來談一下對於執行緒內變

Java併發程式設計筆記4-執行

我們使用執行緒的時候就去建立一個執行緒,但是就會有一個問題:  如果併發的執行緒數量非常多,而且每個執行緒都是執行一個時間很短的任務就結束了,這樣頻繁建立執行緒就會導致大大降低系統的效率,因為頻繁建立執行緒和銷燬執行緒需要時間。那麼有沒有一種辦法使得執行緒可以複用,就是執行完

java併發程式設計多個執行為什麼執行的先後順序不一樣!

jvm為了使得處理器內部的運算單元能儘量被充分利用, 處理器可能會對輸入程式碼進行亂序執行(Out-Of-Order Execution)優化,處理器會在計算之後將亂序執行的結果重組,保證該結果與順序執行的結果是一致的,但並不保證程式中各個語句計算的先後順序與輸入程式碼中的