利用jstack檢視執行緒執行狀態
首先一段程式碼
public class P173ThreadState { public static void main(String[] args) { new Thread(new TimeWaiting(),"TimeWaitingThread").start(); new Thread(new Waiting(),"WaitingThread").start(); //兩個執行緒一個會一獲取鎖,另一個一直被block,阻塞 new Thread(new Blockd(),"BlockThread-1").start(); new Thread(new Blockd(),"BlockThread-2").start(); } //一直在sleep static class Waiting implements Runnable{ @Override public void run() { while(true){ synchronized (Waiting.class){ try { Waiting.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } //執行緒一直在等待 static class TimeWaiting implements Runnable{ @Override public void run() { while(true){ SleepUtils.second(100); } } } //執行緒得到鎖後不會釋放鎖 static class Blockd implements Runnable{ @Override public void run() { synchronized(Blockd.class){ while(true){ SleepUtils.second(100); } } } } }
首先開啟dos命令,進入jdk安裝目錄
輸入Jps獲取當前程序資訊
我的程序id是:10304
D:\jdk1.7.0_80\bin>Jps
10732
10304 P173ThreadState
9568 Jps
繼續輸入:jstack 10304(這是程序ID)
結果如下:可以看到每個執行緒的狀態
D:\jdk1.7.0_80\bin>jstack 10304 2017-04-26 22:41:38 Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode): "DestroyJavaVM" prio=6 tid=0x0000000002e10800 nid=0x1858 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "BlockThread-2" prio=6 tid=0x0000000008d63000 nid=0x2574 waiting for monitor entry [0x000000000aeaf000] java.lang.Thread.State: BLOCKED (on object monitor) at com.yao.book.P173ThreadState$Blockd.run(P173ThreadState.java:48) - waiting to lock <0x00000000eb4f1c10> (a java.lang.Class for com.yao.book.P173ThreadState$Blockd) at java.lang.Thread.run(Unknown Source) "BlockThread-1" prio=6 tid=0x0000000008d60000 nid=0x2b64 waiting on condition [0x000000000adaf000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Unknown Source) at java.util.concurrent.TimeUnit.sleep(Unknown Source) at com.yao.book.SleepUtils.second(SleepUtils.java:8) at com.yao.book.P173ThreadState$Blockd.run(P173ThreadState.java:48) - locked <0x00000000eb4f1c10> (a java.lang.Class for com.yao.book.P173ThreadState$Blockd) at java.lang.Thread.run(Unknown Source) "WaitingThread" prio=6 tid=0x0000000008d59000 nid=0x234 in Object.wait() [0x000000000acae000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000eb4f0160> (a java.lang.Class for com.yao.book.P173ThreadState$Waiting) at java.lang.Object.wait(Object.java:503) at com.yao.book.P173ThreadState$Waiting.run(P173ThreadState.java:22) - locked <0x00000000eb4f0160> (a java.lang.Class for com.yao.book.P173ThreadState$Waiting) at java.lang.Thread.run(Unknown Source) "TimeWaitingThread" prio=6 tid=0x000000000a6f3000 nid=0x283c waiting on condition [0x000000000abae000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Unknown Source) at java.util.concurrent.TimeUnit.sleep(Unknown Source) at com.yao.book.SleepUtils.second(SleepUtils.java:8) at com.yao.book.P173ThreadState$TimeWaiting.run(P173ThreadState.java:37) at java.lang.Thread.run(Unknown Source) "Service Thread" daemon prio=6 tid=0x0000000008d43800 nid=0x1814 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" daemon prio=10 tid=0x0000000008d31000 nid=0x20cc waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" daemon prio=10 tid=0x0000000008d2f000 nid=0x14a4 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Attach Listener" daemon prio=10 tid=0x0000000008d2e000 nid=0x9a0 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x0000000008d2b000 nid=0x1ea0 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=8 tid=0x0000000008cdf000 nid=0x10f4 in Object.wait() [0x000000000a0af000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000eb404858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(Unknown Source) - locked <0x00000000eb404858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(Unknown Source) at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source) "Reference Handler" daemon prio=10 tid=0x0000000008cd4800 nid=0x1488 in Object.wait() [0x0000000009faf000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000000eb404470> (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:503) at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source) - locked <0x00000000eb404470> (a java.lang.ref.Reference$Lock) "VM Thread" prio=10 tid=0x0000000008cd0800 nid=0x4fc runnable "GC task thread#0 (ParallelGC)" prio=6 tid=0x0000000002e27000 nid=0x1ae0 runnable "GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000002e28800 nid=0x2578 runnable "GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002e2a800 nid=0x2f18 runnable "GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002e2c000 nid=0x19a8 runnable "VM Periodic Task Thread" prio=10 tid=0x0000000008d4c800 nid=0x19b8 waiting on condition JNI global references: 107
相關推薦
利用jstack檢視執行緒執行狀態
首先一段程式碼 public class P173ThreadState { public static void main(String[] args) { new Thread(new TimeWaiting(),"TimeWaitingThread").sta
使用jstack檢視當前程序全部執行緒的狀態
1.使用jps 命令找到程序的PID $ jps 225648 Jps 5268 127284 Launcher 226980 Launcher 227624 ConcurrencyTest 2.使用
32-多執行緒--概述+Thread類+多執行緒的建立方式(繼承Thread類+實現Runnable介面)+Runnable介面+執行緒的名稱+執行緒的狀態
一、概述 1、程序:對應的是一個應用程式在記憶體中的所屬空間。程序是不直接執行的,它只是在分配該應用程式的記憶體空間 注:如果一個程式在記憶體中開闢了空間,就代表它在執行。不執行要釋放空間 2、執行緒:程序中的一個負責程式執行的控制單元,也叫執行路徑。一個程序中可以有多個執行路徑,稱之為
【Java多執行緒】執行緒狀態、執行緒池狀態
執行緒狀態: 執行緒共包括以下5種狀態。1. 新建狀態(New) 執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。2. 就緒狀態(Runnable) 也被稱為“可執行狀態”。執行緒物件被建立後,
多執行緒執行狀態 Java
1、普通建立子執行緒 程式碼片段: public class Main { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); System.out.pr
使用者態核心態程序(執行緒)狀態的基礎
文章目錄 1 核心態、使用者態 2 程序/執行緒狀態 3 後備佇列、就緒佇列、阻塞佇列 4 參考 1 核心態、使用者態 核心態:就是執行一些特權指令。 使用者態:在核外的使用者程式不允許執行特權指令。 2 程序/執行緒狀
【面試題】多執行緒在執行過程中,某個執行緒執行時,突然釋放鎖。會發生的特殊狀態
一,背景 今天在刷面試題的時候,做到一道面試題,雖然看了答案,但有一個答案還是不理解。後來研究了一下,得到結論:執行緒拿到鎖進行執行時,哪怕獲得了CPU執行權,但是那個鎖不能丟失,它後面執行的過程都需要帶著鎖,才能往下繼續執行。 二,測試程式碼 /**
執行緒的狀態型別和相互轉換
鎖: 最主要是sleep()方法沒有釋放鎖,而wait()方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。sleep()不出讓系統資源;wait()是進入執行緒等待池等待,出讓系統資源,其他執行緒可以佔用CPU。一般wait()不會加時間限制,因為如果wait()執行緒的執行資源不夠,再出來也沒用,要
11.執行緒的狀態,執行緒池的構造方式,執行緒池的特性
一:執行緒的狀態 (1)初始狀態 實現Runnable介面和繼承Thread可以得到一個執行緒類,new一個例項出來,執行緒就進入了初始狀態。 (2) 就緒狀態 1)就緒狀態只是說你資格執行,排程程式沒有挑選到你,你就永遠是就緒狀態。
java中程序和執行緒以及執行緒的狀態和方法
程序是cpu資源分配的最小單位,執行緒是cpu排程的最小單位。 一個程式至少有一個程序,一個程序至少有一個執行緒. 執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。 另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
Java多執行緒之執行緒的狀態以及之間的切換(轉)
博主最近幾天在面試的時候,被面試官問到了Java多執行緒的幾種狀態,無疑博主已經把該忘記的都忘記了,很是尷尬,回到家中在網上找到一篇部落格,博主認真閱讀了此文章,寫的很詳細,現轉載分享給大家: Java中執行緒的狀態分為6種。 1. 初始(N
java執行緒及狀態轉換
執行緒狀態圖 說明: 執行緒共包括以下5種狀態。 1. 新建狀態(New) : 執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。 2. 就緒狀態(Runnable): 也被稱為“可執行狀態”。執行
java執行緒的狀態變換
下面將會針這張圖對執行緒的狀態轉換來做解釋 在作業系統的課程中把執行緒大致分為了3個狀態 1.就緒狀態(執行緒對資源上鎖,但未分配時間片,等待cpu分配,隨時可以執行) 2.執行狀態(執行緒對資源上鎖,並擁有了時間片,正在執行中) 3.阻塞狀態(在執行狀態下缺失了某種資源導致執行暫
Java第十三天學習筆記~多執行緒(執行緒的狀態、建立執行緒的第二種方式、同步程式碼塊、同步函式)
多執行緒 執行緒的狀態 CPU的執行資格:可以被C
執行緒的狀態圖+無敵類比解釋
執行緒共包括以下5種狀態。 新建狀態(New):執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。 (小明,早上來到學校,想去廁所蹲坑,這就屬於新建蹲坑執行緒) 就緒狀態(Runnable): 也被稱為“可執行狀態”
多執行緒程式設計——執行緒分離狀態之detached
#include <pthread.h> #include <unistd.h> #include <stdio.h> /* 執行緒控制塊 */ static pthread_t tid1; static pthread_t tid2; /* 函式返回
Java多執行緒(一) —— 執行緒的狀態詳解
一、多執行緒概述 1、 程序 是一個正在執行的程式。是程式在計算機上的一次執行活動。 每一個程序執行都有一個執行順序。該順序是一個執行路徑,或者叫一個控制單元。 系統以程序為基本單位進行系統資源的排程和分配。程式要執行,系統就在記憶體中為該程式分配一塊獨立的記憶體空間,載入程式程式碼和資源進行執行。 程式
05-執行緒的狀態以及各狀態之間的轉換詳解
執行緒被創建出來之後,它並不是會立刻執行,而是由多個執行緒進行搶佔CPU資源,那麼,哪一個執行緒搶佔到了,那一個執行緒就來執行。就像之前講的烤燒餅的例子一樣,爐子上面有多個任務在轉,轉到哪個任務(燒餅),那麼,那個任務就執行,也就是說,在這個過程中,涉及到執行緒的生命週期的問題,就是說,從執行緒的建
執行緒的狀態轉換圖
執行緒在一定條件下。狀態會發生變化。 執行緒變化的狀態轉換圖例如以下: 1、新建狀態(New):新建立了一個執行緒物件。 2、就緒狀態(Runnable):執行緒物件建立後,其它執行緒呼叫了該物件的start()方法。 該狀態的執行緒位於可執行執行
三十七、Linux 執行緒——執行緒清理和控制函式、程序和執行緒啟動方式比較、執行緒的狀態轉換
37.1 執行緒清理和控制函式 1 #include <pthread.h> 2 3 void pthread_cleanup_push(void (* rtn)(void *), void *arg); 4 void pthread_cleanup_pop(int execute);