欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

我們將通過一個(gè)例子來學(xué)習(xí)。在這里,我編寫了一個(gè)多線程程序來計(jì)算此數(shù)學(xué)問題:100! + 100000!。即:100的階乘 + 100000的階乘。

數(shù)學(xué)不好的同學(xué)看這里,100 階乘就是:1 * 2 * 3 * …… * 100 = ? ,簡(jiǎn)寫為100!

import java.math.BigInteger;

public class MathProblemSolver {

  //開啟兩個(gè)線程
  public static void main(String arg[]){
    //第一個(gè)線程計(jì)算 100!
    FactorialCalculatingThread thread1 = new FactorialCalculatingThread(100);
    //第二個(gè)線程計(jì)算 100000!
    FactorialCalculatingThread thread2 = new FactorialCalculatingThread(100000);

    thread1.setName("Thread 1");
    thread2.setName("Thread 2");

    thread1.start();
    thread2.start();

    try {
      thread1.join(); //線程Jion,以使主線程在“線程1”和“線程2”都返回結(jié)果之前不會(huì)進(jìn)一步執(zhí)行
      thread2.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    BigInteger result = thread1.getResult().add(thread2.getResult());
    System.out.println("將兩個(gè)線程的計(jì)算結(jié)果相加等于:" + result);
  }

  //用于階乘計(jì)算的線程類
  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() + " 開始階乘的計(jì)算:" + num);
      factorialCalc(num);
      System.out.println(Thread.currentThread().getName() + "執(zhí)行完成");
    }

    //數(shù)的階乘計(jì)算方法
    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; }
  }
}

上面的代碼解釋

  • 開啟兩個(gè)線程,“Thread 1”計(jì)算(100?。┖汀癟hread 2”計(jì)算(100000!)
  • 在main()方法中啟動(dòng)兩個(gè)線程,然后調(diào)用thread1.join()thread2.join(),以使主線程在“線程1”和“線程2”都返回結(jié)果之前不會(huì)進(jìn)一步執(zhí)行。
  • 最后將兩個(gè)線程的計(jì)算結(jié)果相加,得到100! + 100000!

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

Frames 與 Thread 面板

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

如果要檢查其他線程的調(diào)用堆棧,則可以從下拉列表中進(jìn)行選擇。

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

條件斷點(diǎn)-只掛起符合條件的線程

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

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

現(xiàn)在執(zhí)行調(diào)試程序,當(dāng)應(yīng)用暫停時(shí),僅“Thread 2”被暫停。您可以通過以下步驟確認(rèn)“Thread 1”已執(zhí)行并且沒有被掛起:

1.在控制臺(tái)中,您可以通過日志來驗(yàn)證“Thread 1”已運(yùn)行并退出。

2.在“Thread”面板中,可以看到此時(shí)已經(jīng)沒有“Thread 1”,已經(jīng)運(yùn)行完成了!

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

總結(jié)

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

相關(guān)文章

  • Spring?Boot集成RabbitMQ以及隊(duì)列模式操作

    Spring?Boot集成RabbitMQ以及隊(duì)列模式操作

    RabbitMQ是實(shí)現(xiàn)AMQP(高級(jí)消息隊(duì)列協(xié)議)的消息中間件的一種,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot集成RabbitMQ以及隊(duì)列模式操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java 反射機(jī)制知識(shí)詳細(xì)介紹及總結(jié)

    Java 反射機(jī)制知識(shí)詳細(xì)介紹及總結(jié)

    反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制
    2017-01-01
  • eclipse 聯(lián)想功能設(shè)置技巧

    eclipse 聯(lián)想功能設(shè)置技巧

    本文主要介紹了eclipse 聯(lián)想功能設(shè)置技巧的相關(guān)內(nèi)容,還是比較不錯(cuò)的,需要的朋友可以參考。
    2017-10-10
  • Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例

    Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例

    這篇文章主要介紹了Spring Mvc下實(shí)現(xiàn)以文件流方式下載文件的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼

    Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼

    這篇文章主要介紹了Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼,需要的朋友可以參考下
    2017-12-12
  • 在mybatis中如何將Map作為參數(shù)

    在mybatis中如何將Map作為參數(shù)

    這篇文章主要介紹了在mybatis中如何將Map作為參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 軟件開發(fā)七大過程模型

    軟件開發(fā)七大過程模型

    這篇文章主要介紹了Java七大過程模型詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 基于 SASL/SCRAM 讓 Kafka 實(shí)現(xiàn)動(dòng)態(tài)授權(quán)認(rèn)證的方法

    基于 SASL/SCRAM 讓 Kafka 實(shí)現(xiàn)動(dòng)態(tài)授權(quán)認(rèn)證的方法

    在大數(shù)據(jù)處理和分析中?Apache Kafka?已經(jīng)成為了一個(gè)核心組件,本文將從零開始部署?ZooKeeper?和?Kafka?并通過配置?SASL/SCRAM?和?ACL(訪問控制列表)來增強(qiáng)?Kafka?的安全性,需要的朋友可以參考下
    2024-07-07
  • Spring Boot系列教程之日志配置

    Spring Boot系列教程之日志配置

    這篇文章主要給大家介紹了關(guān)于Spring Boot系列教程之日志配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • mybatis-plus update更新操作的三種方式(小結(jié))

    mybatis-plus update更新操作的三種方式(小結(jié))

    本文主要介紹了mybatis-plus update更新操作的三種方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論