一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 在IntelliJ IDEA中多線程并發代碼的調試方法詳解

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

2020-08-05 23:30字母哥博客 Java教程

這篇文章主要介紹了在IntelliJ IDEA中多線程并發代碼的調試方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

我們將通過一個例子來學習。在這里,我編寫了一個多線程程序來計算此數學問題:100! + 100000!。即:100的階乘 + 100000的階乘。

數學不好的同學看這里,100 階乘就是:1 * 2 * 3 * …… * 100 = ? ,簡寫為100!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
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向我們顯示了主線程的調用堆棧。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

總結

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

原文鏈接:https://www.cnblogs.com/zimug/p/13439156.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品视频在线免费 | 日本人与黑人做爰视频网站 | 91短视频破解版 | 亚洲AV无码一区二区三区乱子伦 | 九九99香蕉在线视频美国毛片 | 成人涩涩屋福利视频 | 精选国产AV精选一区二区三区 | 国产精品成人一区二区1 | 美女的隐私视频免费看软件 | 67194最新网址 | 免费观看韩剧网站在线观看 | 99这里精品 | 色狠狠狠狠狠香蕉 | 亚洲国产中文字幕在线视频综合 | a∨79成人网| 91制片厂制作果冻传媒破解 | 好男人资源免费播放在线观看 | 国产自拍啪啪 | 性色AV乱码一区二区三区视频 | 男模chinesegayxxxx | 网址在线观看你懂我意思吧免费的 | 无套啪啪 | sao虎在线精品永久 s0e一923春菜花在线播放 | 楚乔传第二部免费播放电视连续剧 | 人禽l交免费视频观看+视频 | 国色天香高清版 | 精品精品国产自在香蕉网 | 青久久 | 五月婷婷丁香在线视频 | 日日操美女 | 无码毛片内射白浆视频 | 福利片成人午夜在线 | 亚洲精品久久久久福利网站 | 精品国产免费久久久久久婷婷 | 日韩中文字幕在线不卡 | 2018高清国产一道国产 | 秋葵丝瓜茄子草莓榴莲樱桃 | 日韩欧美国产一区 | 午夜欧美精品久久久久久久久 | 免费国产一级观看完整版 | tobu8中国在线观看免费视频 |