最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在IntelliJ IDEA中多線程并發(fā)代碼的調試方法詳解

 更新時間:2020年08月05日 14:01:10   作者:字母哥博客  
這篇文章主要介紹了在IntelliJ IDEA中多線程并發(fā)代碼的調試方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

通常來說,多線程的并發(fā)及條件斷點的debug是很難完成的,或許本篇文章會給你提供一個友好的調試方法。讓你在多線程開發(fā)過程中的調試更加的有的放矢。

我們將通過一個例子來學習。在這里,我編寫了一個多線程程序來計算此數學問題: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”都返回結果之前不會進一步執(zhí)行
      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() + "執(zhí)行完成");
    }

    //數的階乘計算方法
    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”都返回結果之前不會進一步執(zhí)行。
  • 最后將兩個線程的計算結果相加,得到100! + 100000!

下面就讓我們使用IntelliJ IDEA工具來調試這段多線程的代碼。

Frames 與 Thread 面板

調試工具窗口的“Frames”面板包含一個下拉菜單。它的關注點在:由于斷點而導致暫停的線程,并顯示這些線程的調用堆棧信息。在下圖中,斷點位于main()方法中如圖所示的位置,Frame向我們顯示了主線程的調用堆棧。

如果要檢查其他線程的調用堆棧,則可以從下拉列表中進行選擇。

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

條件斷點-只掛起符合條件的線程

假設我正在解決該程序中的錯誤,并且我只需要在“Thread 2”開始運行時就暫停執(zhí)行。這表明我需要在FactorialCalculatingThread的run()方法的第一行上添加一個斷點。因為我們開啟的兩個線程使用的是同一段代碼,所以我們會遇到一個問題-使用該段代碼的所有線程遇到斷點都將被掛起,包括應用程序的“Thread 1”和“Thread 2”。我不希望兩個線程都暫停。該怎么做?

我們可以使用條件斷點功能。添加斷點后,右鍵單擊它,選中“suspend”并選擇“Thread”。然后我們添加條件currentThread().getName().equals("Thread 2"),如下面的屏幕快照所示。此條件確保調試器僅在當前線程的名稱為“Thread 2”時才暫停當前線程:

現在執(zhí)行調試程序,當應用暫停時,僅“Thread 2”被暫停。您可以通過以下步驟確認“Thread 1”已執(zhí)行并且沒有被掛起:

1.在控制臺中,您可以通過日志來驗證“Thread 1”已運行并退出。

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

在不同的IDE版本中,配置條件斷點的方式可能有所不同。但是關鍵思想是要意識到這些功能的存在并加以使用。

總結

到此這篇關于在IntelliJ IDEA中多線程并發(fā)代碼的調試方法的文章就介紹到這了,更多相關IDEA多線程并發(fā)代碼的調試內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 運算符 動力節(jié)點Java學院整理

    Java 運算符 動力節(jié)點Java學院整理

    這篇文章主要介紹了Java 運算符 動力節(jié)點Java學院整理,需要的朋友可以參考下
    2017-04-04
  • Spring注解之@Import注解的使用和源碼分析

    Spring注解之@Import注解的使用和源碼分析

    今天主要介紹Spring @Import注解,在Spring中@Import使用得比較頻繁,它得作用是導入bean,具體的導入方式有多種,特別在SpringBoot項目中,很多地方都使用到了@Import注解,感興趣的小伙伴可以參考閱讀
    2023-04-04
  • java利用Socket實現聊天室功能實例

    java利用Socket實現聊天室功能實例

    這篇文章主要介紹了java利用Socket實現聊天室功能實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Springboot實現TLS雙向認證的方法

    Springboot實現TLS雙向認證的方法

    本文介紹了使用keytool生成和管理自簽名CA證書、服務器證書和客戶端證書的方法,適合Java生態(tài)系統(tǒng),通過配置信任庫和服務器/客戶端配置,實現了Spring Boot中的TLS雙向認證,感興趣的朋友一起看看吧
    2025-02-02
  • IDEA創(chuàng)建Servlet編寫HelloWorldServlet頁面詳細教程(圖文并茂)

    IDEA創(chuàng)建Servlet編寫HelloWorldServlet頁面詳細教程(圖文并茂)

    在學習servlet過程中參考的教程是用eclipse完成的,而我在練習的過程中是使用IDEA的,在創(chuàng)建servlet程序時遇到了挺多困難,在此記錄一下,這篇文章主要給大家介紹了關于IDEA創(chuàng)建Servlet編寫HelloWorldServlet頁面詳細教程的相關資料,需要的朋友可以參考下
    2023-10-10
  • java如何實時動態(tài)獲取properties文件的內容

    java如何實時動態(tài)獲取properties文件的內容

    這篇文章主要介紹了java如何實時動態(tài)獲取properties文件的內容,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java配置數據庫連接池的方法步驟

    java配置數據庫連接池的方法步驟

    java配置數據庫連接池的方法步驟,需要的朋友可以參考一下
    2013-05-05
  • StringBuilder為什么線程不安全深入講解

    StringBuilder為什么線程不安全深入講解

    這篇文章主要給大家介紹了關于StringBuilder為什么線程不安全的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用StringBuilder線程具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • idea 查看一個類的所有子類以及子類的子類并以層級關系顯示

    idea 查看一個類的所有子類以及子類的子類并以層級關系顯示

    這篇文章主要介紹了idea 查看一個類的所有子類以及子類的子類并以層級關系顯示,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • SpringBoot3和mybatis-plus整合出現的問題解決辦法

    SpringBoot3和mybatis-plus整合出現的問題解決辦法

    SpringBoot和MybatisPlus的整合可以讓我們更加方便地進行數據庫操作,這篇文章主要給大家介紹了關于SpringBoot3和mybatisplus整合出現的一些問題的相關資料,需要的朋友可以參考下
    2024-01-01

最新評論

府谷县| 庄浪县| 贵溪市| 分宜县| 怀宁县| 宁远县| 揭阳市| 环江| 嘉义市| 石景山区| 湖南省| 大冶市| 寿光市| 怀远县| 久治县| 竹溪县| 海林市| 河津市| 两当县| 弥勒县| 民权县| 格尔木市| 名山县| 海盐县| 九江县| 怀仁县| 革吉县| 安远县| 城口县| 将乐县| 黎平县| 明水县| 金阳县| 体育| 平邑县| 大关县| 滨州市| 安岳县| 麦盖提县| 武乡县| 淮安市|