1. 程式人生 > >java多執行緒學習之一——執行緒的狀態、上下文切換和執行緒監控

java多執行緒學習之一——執行緒的狀態、上下文切換和執行緒監控

多執行緒

執行緒的狀態

1. NEW(圖中初始狀態):一個剛建立而未啟動的執行緒處於該狀態。由於一個執行緒例項只能被啟動一次,因此一個執行緒只可能有一次處於該狀態。

2. 可執行(RUNNABLE):表示處於改狀態的執行緒可以被JVM的執行緒排程器(scheduler)進行排程而使之處於執行中(RUNNING)狀態。

阻塞狀態(BLOCKED):一個執行緒發起一個阻塞式I/O操作後,或者試圖去獲得一個由其他執行緒持有的鎖時,相應的執行緒會處於該狀態。處於改狀態的執行緒不會佔用CPU資源。

3. 等待佇列:分為兩個,WAITING和TIMED_WAITING

1) WAITING一個執行緒執行了某些方法呼叫之後就會處於這種無限等待其他執行緒執行特定操作的狀態。這個方法包括:Object.wait()、Thread.join()

LockSupport.park()

對應使執行緒轉換為可執行狀態的方法是:Object.notify()、Object.notifyAll()LockSupport.unpark(thread)。

2)TIMED_WAITING 與WAITING類似,差別是該狀態的執行緒並非無限等待其他執行緒執行特定操作,而是處於帶有時間限制的等待狀態。當時間到了,自動轉化為可執行狀態

4. 結束(TERMINATED):已經執行結束的執行緒處於該狀態。

上下文切換

一個執行緒在其整個生命週期中,只可能一次處於NEW狀態和TERMINATED狀態。而一個執行緒的狀態從RUNNABLE狀態轉換為WAITING、TIMED_WAITING、BLOCKED這幾個狀態的任意一個都是上下文切換。

執行緒的監視

一個真實的java系統執行時往往有上百個執行緒在執行,如果沒有工具進行監控,那麼這些執行緒對於我們來說就變成了黑盒。而我們在開發過程中進行程式碼除錯,需要將執行緒變為白盒。

1) 開發和測試環境下

JDK自帶工具jvisualvm(JDK_HOME\bin\jvisualvm.exe 可以實現執行緒的監控,它適合於在開發和測試環境下監控java系統中的執行緒情況

啟動介面如圖:


2) 線上環境

JDK自帶的另外一個工具jstack。jstack是一個命令列工具,通過它可以獲取指定java程序的執行緒資訊。

使用方法:先找到要分析的程序pid,然後使用命令:jstack pid

3) java 8

Java Mission Control(JMC) 這個工具來監視java執行緒

參考:

《java多執行緒程式設計實戰指南》黃文海

相關推薦

java執行學習之一——執行狀態上下文切換執行監控

多執行緒 執行緒的狀態 1. NEW(圖中初始狀態):一個剛建立而未啟動的執行緒處於該狀態。由於一個執行緒例項只能被啟動一次,因此一個執行緒只可能有一次處於該狀態。 2. 可執行(RUNNABLE):表示處於改狀態的執行緒可以被JVM的執行緒排程器(scheduler)進

C# 執行學習系列四之取消超時子執行操作

1、簡介 雖然ThreadPool、Thread能開啟子執行緒將一些任務交給子執行緒去承擔,但是很多時候,因為某種原因,比如子執行緒發生異常、或者子執行緒的業務邏輯不符合我們的預期,那麼這個時候我們必須關閉它,而不是讓它繼續執行,消耗資源.讓CPU不在把時間和資源花在沒有意義的程式碼上.  

執行學習筆記六之併發工具類CountDownLatchCyclicBarrier

目錄 簡介 CountDownLatch 示例 實現分析 CountDownLatch與Thread.join() CyclicBarrier 實現分析 CountDownLatch和CyclicBarrier區別 簡介

flask學習筆記(十七) --上下文環境與執行隔離

Flask從客戶端收到請求時,要讓檢視函式能訪問一些物件,這樣才能處理請求。Flask使用請求物件封裝了客戶端傳送的HTTP請求,傳遞給檢視函式。請求物件存在哪?請求物件存在於當前的上下文環境中。也就是說,上下文可以臨時地把某些物件變成為全域性訪問的變數。多執行緒則完成上下文

學習筆記之執行Thread類執行終止相關整理(下)——執行異常&JVM停止

提到執行緒的中斷在某些情況下會丟擲InterruptedException異常,最終導致執行緒的終止。其實,執行緒也有可能由於其他異常原因造成終止,在某些情況下為了做一些妥善的處理,我們需要捕獲這些異常情況。看下面程式碼,覺得會怎樣? 1 2 3 4 5

[C++][執行安全]單例模式下雙檢查鎖執行

問題 在設計模式中,有一個很經典的模式-單例模式,它可能是實現上最簡單的模式,在程式碼中也經常使用,在單執行緒下,毫無疑問延遲化載入是比較常用的,但是在多執行緒條件下,單例模式的延遲載入可能就會出現一些問題。 如以下的程式碼: T* GetInstance(

執行上下文切換程序上下文切換的區別

程序切換分兩步1.切換頁目錄以使用新的地址空間2.切換核心棧和硬體上下文。對於linux來說,執行緒和程序的最大區別就在於地址空間。對於執行緒切換,第1步是不需要做的,第2是程序和執行緒切換都要做的。所以明顯是程序切換代價大 執行緒上下文切換和程序上下問切換一個最主要的區別是執行緒的切換虛擬記憶體空間依

執行建立,狀態,以及上下文切換簡介

package my.thread.test1; public class InitThread { public static void main(String[] args) {

用C++11的std::async代替執行的建立and std::futurestd::promisestd::packaged_task

c++11中增加了執行緒,使得我們可以非常方便的建立執行緒,它的基本用法是這樣的: void f(int n); std::thread t(f, n + 1); t.join();   但是執行緒畢竟是屬於比較低層次的東西,有時候使用有些不便,比如我希望獲取執行緒函式的返回結果的時候,我就不能直接通過

執行狀態上下文切換

Java語言中,一個執行緒從其建立、啟動到其執行結束的整個生命週期可能經歷若干個狀態,如下圖所示。                      Java執行緒的狀態可以通過Thread例項的getState()方法獲取。Thread.State所定義的執行緒狀態包括以下幾種。 

Flask 上下文機制執行隔離

> **1. 電腦科學領域的任何問題都可以通過增加一個間接的中間層來解決**, 上下文機制就是這句話的體現。 > > **2. 如果一次封裝解決不了問題,那就再來一次** 上下文:相當於一個容器,儲存了Flask程式執行過程中的一些資訊 原始碼:[flask/ctx.py](https://github.c

Java線程學習

和數 整數 locked dex block resume run for new 首先講一下進程和線程的區別:   進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。   線程:同一類線程共享代碼和數據空間,每個

Java 線程學習擴展

lock 多線程編程 等待 交互 call tor .com 技術 memory http://www.imooc.com/video/5176 一、如何擴展Java並發知識 Java Memory Mode   JMM描述了Java線程如何通過內存進行交互   happe

Java線程學習篇(二)synchronized

參考 .get name syn his col 靜態方法 runtest 作用範圍 synchronized 有二種修飾方法: 修飾一個方法 synchronized public void runTest{ /**/ } 修飾一個代碼塊 publi

Java線程學習篇(三)Lock

參考 簡單 which sys lin int some call row Lock 是Java多線程的一個同步機制,用來控制線程對共享資源的訪問。線程在執行同步方法或者代碼塊之前必須先獲得一個鎖。 Lock 的 lock() 和 unlock() 方法;   lock()

JMeter學習(三) 元件的作用域執行順序

關於 sse blank 原則 問題 element spa pan ons 轉載自 ==== jmeter學習(三)元件的作用域與執行順序 1.元件的作用域 JMeter中共有8類可被執行的元件(測試計劃與線程組不屬於元件),這些元件中,取樣器是典型的不與其它元件發生

Java線程學習(八)線程池與Executor 框架

技術分享 機制 throws rmi 3.6 .get C4D 之前 源文件 Java面試通關手冊(Java學習指南,歡迎Star,會一直完善下去,歡迎建議和指導):https://github.com/Snailclimb/Java_Guide 歷史優質文章推薦: Jav

java線程學習-一

[] 開啟 類對象 run方法 clas 線程學習 sys read pre 開啟多線程 1,繼承Thread2,重寫run方法3,將要執行的代碼寫在run方法中4,創建Thread類的子類對象5,開啟線程 /** * @param args *

java線程學習

ati rri code pub ner read 線程學習 參數傳遞 void //1,定義一個類實現Runnable //2,重寫run方法 //3,將要執行的代碼寫在run方法中 //4,創建Runnable的子類對象 //5,將其當作參數傳遞給Thread的構造函數

Java線程學習幸運飛艇采集器修復

多線程 運行 ofo end rgs static java pack 線程 package javastudy01; class MyThread extends Thread {//重寫Run方法public void run(){//1.獲取當前線程的名字System