1. 程式人生 > >Java 多執行緒詳解(五)------執行緒的宣告週期

Java 多執行緒詳解(五)------執行緒的宣告週期

這篇部落格介紹執行緒的生命週期。

  執行緒是一個動態執行的過程,它也有從建立到死亡的過程。

在 Thread 類中,有一個列舉內部類:

  

上面的資訊以圖片表示如下:

  第一張圖:

  

  第二張圖:把等待、計時等待、阻塞看成阻塞一個狀態了

  

1、新建狀態(new):使用 new 建立一個執行緒,僅僅只是在堆中分配了記憶體空間

           新建狀態下,執行緒還沒有呼叫 start()方法啟動,只是存在一個執行緒物件而已

          Thread t = new Thread();//這就是t執行緒的新建狀態

2、可執行狀態(runnable):新建狀態呼叫 start() 方法,進入可執行狀態。而這個又分成兩種狀態,ready 和 running,分別表示就緒狀態和執行狀態

    就緒狀態:執行緒物件呼叫了 start() 方法,等待 JVM 的排程,(此時該執行緒並沒有執行)

    執行狀態:執行緒物件獲得 JVM 排程,如果存在多個 CPU,那麼執行多個執行緒並行執行

  注意:執行緒物件只能呼叫一次 start() 方法,否則報錯:illegaThreadStateExecptiong

3、阻塞狀態(blocked):正在執行的執行緒因為某種原因放棄 CPU,暫時停止執行,就會進入阻塞狀態。此時 JVM 不會給執行緒分配 CPU,知道執行緒重新進入就緒狀態,才有機會轉到 執行狀態。

  注意:阻塞狀態只能先進入就緒狀態,不能直接進入執行狀態

  阻塞狀態分為兩種情況:

    ①、當執行緒 A 處於可執行狀態中,試圖獲取同步鎖時,卻被 B 執行緒獲取,此時 JVM 把當前 A 執行緒放入鎖池中,A執行緒進入阻塞狀態

    ②、當執行緒處於執行狀態時,發出了 IO 請求,此時進入阻塞狀態

4、等待狀態(waiting):等待狀態只能被其他執行緒喚醒,此時使用的是無引數的 wait() 方法

  ①、當執行緒處於執行狀態時,呼叫了 wait() 方法,此時 JVM 把該執行緒放入等待池中

5、計時等待(timed waiting):呼叫了帶引數的 wait(long time)或 sleep(long time) 方法

  ①、當執行緒處於執行狀態時,呼叫了帶引數 wait 方法,此時 JVM 把該執行緒放入等待池中

  ②、當前執行緒呼叫了 sleep(long time) 方法

6、終止狀態(terminated):通常稱為死亡狀態,表示執行緒終止

  ①、正常終止,執行完 run() 方法,正常結束

  ②、強制終止,如呼叫 stop() 方法或 destory() 方法

  ③、異常終止,執行過程中發生異常

下面詳細介紹執行緒的幾種方法:

1、sleep(long millis)執行緒休眠:讓執行的執行緒暫停一段時間,進入計時等待狀態。

    static void sleep(long millis):呼叫此方法後,當前執行緒放棄 CPU 資源,在指定的時間內,sleep 所在的執行緒不會獲得可執行的機會,此狀態下的執行緒不會釋放同步鎖(注意和 wait() 的區別,wait 會放棄 CPU 資源,同時也會放棄 同步鎖)

    該方法更多的是用來模擬網路延遲,讓多執行緒併發訪問同一資源時的錯誤效果更加明顯。

   2、join()聯合執行緒:表示這個執行緒等待另一個執行緒完成後(死亡)才執行,join 方法被呼叫之後,執行緒物件處於阻塞狀態。寫在哪個執行緒中,哪個執行緒阻塞

    這種也稱為聯合執行緒,就是說把當前執行緒和當前執行緒所在的執行緒聯合成一個執行緒

package com.ys.thread;

class Join extends Thread{
	@Override
	public void run() {
		for(int i = 0 ; i < 10 ;i++){
			System.out.println("播放音樂"+i);
		}
	}
}

public class ThreadTest {
	public static void main(String[] args) {
		//建立 join 執行緒物件
		Join joinThread = new Join();
		for(int i = 0 ; i < 10 ; i++){
			System.out.println("玩遊戲"+i);
			if(i==3){
				joinThread.start();
			}
			if(i==5){
				try {
					joinThread.join();//強制執行 join 執行緒,知道 join 執行完畢了,main 才有機會執行
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

  結果:

玩遊戲0
玩遊戲1
玩遊戲2
玩遊戲3
玩遊戲4
玩遊戲5
播放音樂0
播放音樂1
播放音樂2
播放音樂3
播放音樂4
播放音樂5
播放音樂6
播放音樂7
播放音樂8
播放音樂9
玩遊戲6
玩遊戲7
玩遊戲8
玩遊戲9

後臺執行緒(守護執行緒):在後臺執行的執行緒,其目的是為其他執行緒提供服務,也稱為“守護執行緒”。

①、JVM 的垃圾回收執行緒就是守護執行緒。

②、main 方法是前臺執行緒,不是後臺執行緒

  

public static void main(String[] args) {
		String mainThreadName = Thread.currentThread().getName();
		System.out.println(mainThreadName);  //main
		
		System.out.println(Thread.currentThread().isDaemon());//false
		
	}

特點:

①、若所有的前臺執行緒都死亡,則後臺執行緒自動死亡;

②、前臺執行緒沒有結束,後臺執行緒是不會結束的;

③、前臺執行緒建立的執行緒是前臺執行緒,後臺執行緒建立的執行緒是後臺執行緒。

  Thread.setDaemon(Boolean on)必須在 start() 的方法前呼叫。否則會報錯。

執行緒的優先順序:

  每個執行緒都有一個優先順序,這有助於 系統確定執行緒的調動順序。

  Java 執行緒的優先順序是一個整數,取值範圍是:1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )

  預設情況下,每一個執行緒都會分配一個優先順序 NORM_PRIORITY(5)。

  具有較高優先順序的執行緒對程式更重要,並且應該在低優先順序的執行緒之前分配處理器資源。但是,執行緒優先順序不能保證執行緒執行的順序,而且非常依賴於平臺。

執行緒禮讓:

yield()方法:表示當前執行緒物件提示排程器自己願意讓出 CPU 資源,但是排程器可以自由的忽略該提示。

       呼叫該方法後,執行緒物件進入就緒狀態,所以完全有可能:某個執行緒呼叫了 yield() 方法,但是執行緒排程器又把它排程出來重新執行。

從 Java7 提供的文件上可以清楚的看出,開發中會很少使用該方法,該方法主要運用於除錯或測試,它可能有助於多執行緒競爭條件下的錯誤重現現象。

sleep() 和 yield() 方法的區別:

  ①、都能使當前處於執行狀態的執行緒放棄 CPU資源,把執行的機會給其他執行緒

  ②、sleep 方法會給其他執行緒執行的機會,但是不考慮其他執行緒優先順序的問題;yield 方法會優先給更高優先順序的執行緒執行機會

  ③、呼叫 sleep 方法後,執行緒進入計時等待狀態,呼叫 yield 方法後,執行緒進入就緒狀態。

相關推薦

Java 執行------執行宣告週期

這篇部落格介紹執行緒的生命週期。   執行緒是一個動態執行的過程,它也有從建立到死亡的過程。 在 Thread 類中,有一個列舉內部類:    上面的資訊以圖片表示如下:   第一張圖:      第二張圖:把等待、計時等待、阻塞看成阻塞一個狀態了    1、新建狀態(new):使用 new 建立一個

WPF執行——BeginInvoke

本文將通過一個WPF模擬程式來演示一下介面卡死的現象,並通過修改程式碼來解決介面卡死的問題。希望通過對本文的學習,大家能對Dispatcher.BeginInvoke()方法有一個新的認識。文章開篇直接給出介面卡死的示例程式碼。示例WPF程式,用來計算1~n的和值,這裡的n可

Java 線程------線程的同步

alt 來看 監聽 介紹 創建進程 java 多線程 system ima 關鍵字 Java 多線程詳解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多線程詳解(二)------如何創建進

執行

多執行緒詳解(二) 在正式介紹執行緒建立的第二種方法之前,我們接著多執行緒詳解(一),講一下:對執行緒的記憶體圖、執行緒的狀態,為下面的學習打下基礎,小夥伴們不要急喲!! 一、多執行緒執行的記憶體圖(ps.博主沒有找到合適的畫圖工具,歡迎大神們貢獻啊) class pers

執行

[多執行緒詳解(一)](http://www.neilx.com) 一、概念準備 1、程序 (1)直譯:正在進行中的程式 (2)解釋:執行一個程式時,會在記憶體中為程式開闢空間,這個空間就是一個程序。 (3)注意:一個程序中不可能沒有執行緒,只有有了執行緒才能執行; 程序只

.NET執行技術4 執行優先順序

執行緒優先順序從高到低分為:Highest 、AboveNormal、Normal、BelowNormal、Lowest共5個等級。通過設定Thread類的ThreadPriority屬性(可讀寫屬性)來調整。 範例: 下面的程式碼示例說明了更改執行緒優先順序的結果。建立兩

c++11執行

  原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/10914162.html              最近是恰好寫了一些c++11多執行緒有關的東西,就寫一下筆記留著以後自己忘記回來看吧,也不是專門寫給讀者看的,我就想到哪就寫到哪吧 &nbs

java程式設計師菜鳥進階oracle基礎oracle資料庫體系架構

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JAVA設計模式----------狀態模式

各位朋友,本次LZ分享的是狀態模式,在這之前,懇請LZ解釋一下,由於最近公司事情多,比較忙,所以導致更新速度稍微慢了些(哦,往後LZ會越來越忙=。=)。 狀態模式,又稱狀態物件模式(Pattern of Objects for States),狀態模式是物件的行為模式。

POSIX 執行

執行緒是有趣的 瞭解如何正確運用執行緒是每一個優秀程式設計師必備的素質。執行緒類似於程序。如同程序,執行緒由核心按時間分片進行管理。在單處理器系統中,核心使用時間分片來模擬執行緒的併發執行,這種方式和程序的相同。而在多處理器系統中,如同多個程序,執行緒實際上一樣可以併發

Java虛擬機器------執行時記憶體結構

  首先通過一張圖瞭解 Java程式的執行流程:      我們編寫好的Java原始碼程式,通過Java編譯器javac編譯成Java虛擬機器識別的class檔案(位元組碼檔案),然後由 JVM 中的類載入器載入編譯生成的位元組碼檔案,載入完畢之後再由 JVM 執行引擎去執行。在載入完畢到執行過程中,J

Java虛擬機器------JVM引數持續更新

  JVM引數有很多,其實我們直接使用預設的JVM引數,不去修改都可以滿足大多數情況。但是如果你想在有限的硬體資源下,部署的系統達到最大的執行效率,那麼進行相關的JVM引數設定是必不可少的。下面我們就來對這些JVM引數進行詳細的介紹。   JVM引數主要分為以下三種(可以根據書寫形式來區分): 1、標準引

std::thread執行1

## 目錄 - [目錄](#目錄) - [簡介](#簡介) - [執行緒的使用](#執行緒的使用) - [執行緒的建立](#執行緒的建立) - [執行緒的方法和屬性](#執行緒的方法和屬性) - [std::jthread (C++20)](#stdjthread-c20) - [sto

10.5-全棧Java筆記:常見流

java上節我們講到「Java中常用流:緩沖流」,本節我們學習數據流和對象流~ 數據流數據流將“基本數據類型變量”作為數據源,從而允許程序以與機器無關方式從底層輸入輸出流中操作java基本數據類型。 DataInputStream和DataOutputStream提供了可以存取與機器無關的所有Java基礎類

SpringMVC------參數綁定

@override 占用 通過 問題 顯示 led prop -s 意義   參數綁定,簡單來說就是客戶端發送請求,而請求中包含一些數據,那麽這些數據怎麽到達 Controller ?這在實際項目開發中也是用到的最多的,那麽 SpringMVC 的參數綁定是怎麽實現的呢?下

Spring------AOP

利用 未來 bject ted r.java -c cti throw 位置   這章我們接著講 Spring 的核心概念---AOP,這也是 Spring 框架中最為核心的一個概念。   PS:本篇博客源碼下載鏈接:http://pan.baidu.com/s/1skZ

Java的反射機制

pbc spa 詳解 uno face target lan tor cin 8n72q傅釁8戰sig叢http://www.docin.com/app/user/userinfo?userid=179185461 8u炊3F7LB椒1http://huiyi.docin.

PHP與Java集成開發

new 編程語言 到你 其中 web-inf request 測試 add 輸入 很久以前,有人從www上看到看到天空上一個很亮的亮點,它就是Java語言,與此同時,在另一個地方一位夢想家也看到了一個亮點,它就是PHP。 時間一天天過去,這兩個亮點也變得越來越亮,很快,它

CentOS 7.4 Tengine安裝配置

tengine nginx https 十四、配置Tengine支持HTTPS1、演示環境:IP操作系統角色 192.168.1.222 CentOS 7.4 Tengine服務器 192.168.1.145 CentOS 6.9 自建CA服務器備註:Teng

Zookeeper:通過JMX查看Zookeeper信息

JMXJMX是對運行中的JAVA系統進行管控。目前ZK使用標準的JMX接口。修改ZK的啟動腳本zkServer.sh這個啟動腳本進行修改,第一句不是必須的,但是第二句是必須的在conf目錄下新建java.env文件重新啟動為什麽要在conf裏面建立一個java.env呢?其實你都寫在zkServer.sh中也