以下代码为例:
public class ThreadClass {
static int i = 0;
public static void main(String[] args) {
new Thread(() -> {
doSomething();
return;
}).start();
doSomething();
}
private static void doSomething() {
while (true) {
i++;
}
}
}
- jps 查询卡住的进程id;
$ jps
2496 RemoteMavenServer
2932 Jps
15144 ThreadClass
8088 Launcher
3564
- jstack 进程id,查看里面所有的方法栈;
$ jstack 15144
"Thread-0" #11 prio=5 os_prio=0 tid=0x00000000191a0000 nid=0x2184 runnable [0x0000000019d0e000]
java.lang.Thread.State: RUNNABLE
//↓↓↓在方法栈中的每一行代表一个栈针
//即使两个线程调用同一个方法,但两个栈针是独立的,虽然他们共享同一个变量i,但是两个方法栈栈针的局部变量都是私有的;
//代码是说明书,线程是工人,两个工人拿着相同的说明书分别创建了两个栈针;
at com.project.ThreadClass.doSomething(ThreadClass.java:17)
at com.project.ThreadClass.lambda$main$0(ThreadClass.java:9)
at com.project.ThreadClass$$Lambda$1/42768293.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
"main" #1 prio=5 os_prio=0 tid=0x00000000028f7000 nid=0x2e4 runnable [0x000000000272f000]
java.lang.Thread.State: RUNNABLE
at com.project.ThreadClass.doSomething(ThreadClass.java:17)
at com.project.ThreadClass.main(ThreadClass.java:12)
网友评论