Monitor Ctrl-Break執行緒這個在idea中特有的執行緒,你瞭解嗎?這執行緒可能會在你除錯的時候給你帶來謎一樣的結果,為什麼呢?請看下面的例子:
首先我們先複習一下多執行緒的狀態(因為這個問題是我在複習多執行緒的時候發現的問題)
對於執行緒的所有狀態該如何去檢視呢?執行緒的狀態都是怎麼產生的這些面試高頻題目,我們是否還記得呢?下面附上程式碼用程式碼再一次複習一下,簡單明瞭。
下面是全部的程式碼:
1 /** 2 * @Description: 檢視執行緒的所有狀態 3 * @ProjectName: demo 4 * @Package: com.thread 5 * @Author: XiaoHeMa 6 * @CreateDate: 2020/10/24 9:03 7 */ 8 9 public class ThreadSate { 10 11 12 13 public static void main(String[] args) { 14 15 Thread thread = new Thread(() -> { 16 17 for (int i = 0; i < 5; i++) { 18 19 try { 20 21 Thread.sleep(100); 22 23 } catch (InterruptedException e) { 24 25 e.printStackTrace(); 26 27 } 28 29 } 30 31 System.out.println("---thread執行緒結束---"); 32 33 }); 34 35 //檢視執行緒的狀態 36 37 Thread.State state = thread.getState(); 38 39 //這時候我們只是建立了個執行緒 也就是NEW的狀態 40 41 System.out.println("執行緒狀態 " + state); 42 43 //啟動執行緒 44 45 thread.start(); 46 47 //檢視執行緒的狀態 48 49 state = thread.getState(); 50 51 //這時候我們已經啟動了執行緒,然後來看看現線上程的狀態 RUNNABLE 52 53 System.out.println("執行緒狀態 " + state); 54 55 56 57 58 59 60 61 //根據執行緒的狀態來停止死迴圈 62 63 // while (state != Thread.State.TERMINATED) { 64 65 // try { 66 67 // Thread.sleep(200); 68 69 // } catch (InterruptedException e) { 70 71 // e.printStackTrace(); 72 73 // } 74 75 // //檢視執行緒的狀態 76 77 // state = thread.getState(); 78 79 // System.out.println("執行緒狀態 " + state); 80 81 // } 82 83 84 85 86 87 //根據執行緒的總條數來停止死迴圈 88 89 while (true) { 90 91 int i = Thread.activeCount(); 92 93 System.out.println("目前執行緒數量:" + i); 94 95 /** 96 * Monitor Ctrl-Break這個執行緒只會在IDEA中被列印出來 97 * 在IDEA中通過debug啟動的不會出現,只有run啟動的會出現 98 * 所以在idea中執行run的時候這個要寫成2而不能是1在eclipse 99 * 中卻不會出現這個問題,這是軟體引起的在開發除錯過程要注意。 100 */ 101 102 if (i == 2) { 103 104 break; 105 106 } 107 108 try { 109 110 Thread.sleep(200); 111 112 } catch (InterruptedException e) { 113 114 e.printStackTrace(); 115 116 } 117 118 //檢視執行緒的狀態 119 120 state = thread.getState(); 121 122 System.out.println("執行緒狀態 " + state); 123 124 } 125 126 127 128 129 130 } 131 132 }
結果:
對於程式碼中有檢驗的方式:一種是
Thread.State.TERMINATED
採用執行緒的狀態來判斷執行緒是否結束
另一種是通過執行緒的數量來判斷執行緒的數量
Thread.activeCount()
注意(使用idea的小夥伴要注意了,在idea中使用
Thread.activeCount()
debug啟動的不會出現,只有run啟動的會出現,出現執行緒數最後有2條的問題,所以在上面的程式碼中才用
if (i == 2) { break; }
)
Monitor Ctrl-Break執行緒是在idea中才有的,而且還是要用run啟動方式,所以在寫測試程式碼的小夥伴要注意了!!!
測試程式碼
public class Main extends Thread { public static void main(String[] args) { Main t1 = new Main(); t1.setName("thread01"); t1.start(); ThreadGroup currentGroup = Thread.currentThread().getThreadGroup(); int noThreads = currentGroup.activeCount(); Thread[] lstThreads = new Thread[noThreads]; currentGroup.enumerate(lstThreads); for (int i = 0; i < noThreads; i++) { System.out.println("執行緒號:" + i + " = " + lstThreads[i].getName()); } } }