一、案例
- 監控線程情況,包括阻塞、死循環等
1.1 代碼如下,下述代碼共有三個線程,Main、mythread01、mythread02線程,其中mythread01線程為死循環、mythread02為阻塞線程
package jvm; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class JStackTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); sc.next(); /** * 該線程死循環 */ new Thread(new Runnable() { @Override public void run() { while (true) { } } }, "mythread01").start(); sc.next(); /** * 該線程阻塞 */ testWait(new Object()); } private static void testWait(Object obj) { new Thread(new Runnable() { @Override public void run() { synchronized (obj) { try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }, "mythread02").start(); } }
- 運行程序,打開jconsole,結果如下圖,此時只有main線程,且該線程狀態為Runable,main線程阻塞因為正在等待用戶輸入(sc.next();)。

- 在console輸入一次之后,如下圖

- 再查看jconsole,結果如下,發現多了一個mythread01線程,且該線程也為Runable狀態,查看代碼發現該線程是死循環所以阻塞。

- 再在console輸入一次,如下圖

- 再查看jconsole,結果如下,main線程已經執行完畢了,所以消失了。mythread01線程還在執行(死循環),多了mythread02線程,該線程為WATING狀態

