利用jstack查看线程运行状态

时间:2022-10-25 00:42:32

首先一段代码

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