通常來說,多執行緒的并發及條件斷點的debug是很難完成的,或許本篇文章會給你提供一個友好的除錯方法,讓你在多執行緒開發程序中的除錯更加的有的放矢,
我們將通過一個例子來學習,在這里,我撰寫了一個多執行緒程式來計算此數學問題:100! + 100000!,即:100的階乘 + 100000的階乘,
數學不好的同學看這里,100 階乘就是:1 * 2 * 3 * …… * 100 = ? ,簡寫為100!
import java.math.BigInteger;
public class MathProblemSolver {
//開啟兩個執行緒
public static void main(String arg[]){
//第一個執行緒計算 100!
FactorialCalculatingThread thread1 = new FactorialCalculatingThread(100);
//第二個執行緒計算 100000!
FactorialCalculatingThread thread2 = new FactorialCalculatingThread(100000);
thread1.setName("Thread 1");
thread2.setName("Thread 2");
thread1.start();
thread2.start();
try {
thread1.join(); //執行緒Jion,以使主執行緒在“執行緒1”和“執行緒2”都回傳結果之前不會進一步執行
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
BigInteger result = thread1.getResult().add(thread2.getResult());
System.out.println("將兩個執行緒的計算結果相加等于:" + result);
}
//用于階乘計算的執行緒類
private static class FactorialCalculatingThread extends Thread {
private BigInteger result = BigInteger.ONE;
private long num;
public FactorialCalculatingThread(long num) {
this.num = num;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 開始階乘的計算:" + num);
factorialCalc(num);
System.out.println(Thread.currentThread().getName() + "執行完成");
}
//數的階乘計算方法
public void factorialCalc(long num) {
BigInteger f = new BigInteger("1");
for (int i = 2; i <= num; i++)
f = f.multiply(BigInteger.valueOf(i));
result = f;
}
public BigInteger getResult() { return result; }
}
}
上面的代碼解釋
- 開啟兩個執行緒,“Thread 1”計算(100!)和“Thread 2”計算(100000!)
- 在main()方法中啟動兩個執行緒,然后呼叫
thread1.join()和thread2.join(),以使主執行緒在“執行緒1”和“執行緒2”都回傳結果之前不會進一步執行, - 最后將兩個執行緒的計算結果相加,得到
100! + 100000!
下面就讓我們使用IntelliJ IDEA工具來除錯這段多執行緒的代碼,
Frames 與 Thread 面板
除錯工具視窗的“Frames”面板包含一個下拉選單,它的關注點在:由于斷點而導致暫停的執行緒,并顯示這些執行緒的呼叫堆疊資訊,在下圖中,斷點位于main()方法中如圖所示的位置,Frame向我們顯示了主執行緒的呼叫堆疊,

如果要檢查其他執行緒的呼叫堆疊,則可以從下拉串列中進行選擇,

Thread面板顯示當前處于活動狀態的所有執行緒,參考上面的代碼,我在thread1.join()添加了一個斷點,當應用程式在該斷點處暫停時,我們應該在此窗格中至少看到三個執行緒-“main”,“Thread 1”和“Thread 2”(請看下面的螢屏截圖),您可以雙擊每個執行緒以觀察其呼叫堆疊,

條件斷點-只掛起符合條件的執行緒
假設我正在解決該程式中的錯誤,并且我只需要在“Thread 2”開始運行時就暫停執行,這表明我需要在FactorialCalculatingThread的run()方法的第一行上添加一個斷點,因為我們開啟的兩個執行緒使用的是同一段代碼,所以我們會遇到一個問題-使用該段代碼的所有執行緒遇到斷點都將被掛起,包括應用程式的“Thread 1”和“Thread 2”,我不希望兩個執行緒都暫停,該怎么做?
我們可以使用條件斷點功能,添加斷點后,右鍵單擊它,選中“suspend”并選擇“Thread”,然后我們添加條件currentThread().getName().equals("Thread 2"),如下面的螢屏快照所示,此條件確保除錯器僅在當前執行緒的名稱為“Thread 2”時才暫停當前執行緒:

現在執行除錯程式,當應用暫停時,僅“Thread 2”被暫停,您可以通過以下步驟確認“Thread 1”已執行并且沒有被掛起:
1.在控制臺中,您可以通過日志來驗證“Thread 1”已運行并退出,

2.在“Thread”面板中,可以看到此時已經沒有“Thread 1”,已經運行完成了!

在不同的IDE版本中,配置條件斷點的方式可能有所不同,但是關鍵思想是要意識到這些功能的存在并加以使用,
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103706.html
標籤:Java
