在IntelliJ IDEA中多线程并发代码的调试方法详解

作者:字母哥博客 时间:2022-01-09 03:05:45 

通常来说,多线程的并发及条件断点的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向我们显示了主线程的调用堆栈。

在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版本中,配置条件断点的方式可能有所不同。但是关键思想是要意识到这些功能的存在并加以使用。

来源:https://www.cnblogs.com/zimug/p/13439156.html

标签:IDEA,多线程,并发代码,调试
0
投稿

猜你喜欢

  • Intellij IDEA中启动多个微服务(开启Run Dashboard管理)

    2022-01-11 02:25:00
  • java8 实现提取集合对象的每个属性

    2023-10-17 19:37:27
  • Java链表(Linked List)基本原理与实现方法入门示例

    2021-10-12 05:49:14
  • springboot集成RestTemplate及常见的用法说明

    2023-02-17 20:02:27
  • Android ListView的Item点击效果的定制

    2023-06-21 11:46:01
  • MyBatis-Plus实现多数据源的示例代码

    2023-11-11 12:58:11
  • MyBatis学习教程(三)-MyBatis配置优化

    2023-10-31 21:13:51
  • 详解Maven settings.xml配置(指定本地仓库、阿里云镜像设置)

    2022-04-09 23:45:14
  • Java中反射动态 代理接口的详解及实例

    2023-11-28 05:29:36
  • 解决mybatis批量更新出现SQL报错问题

    2023-11-29 04:12:47
  • Java动态 代理和AOP应用示例

    2023-11-26 07:45:02
  • Java日常练习题,每天进步一点点(33)

    2023-09-22 05:32:41
  • Android控件之SlidingDrawer(滑动式抽屉)详解与实例分享

    2023-07-27 09:26:18
  • Android 实现永久保存数据的方法详解

    2023-06-23 22:13:23
  • Java C++实现相同MD5加密算法的方式

    2023-10-12 12:26:02
  • mybatis-plus查询源码详解

    2023-02-02 11:58:02
  • 深入理解Java虚拟机体系结构

    2021-09-15 19:46:53
  • Java实现的Base64加密算法示例

    2023-10-29 00:37:08
  • 你知道将Bean交给Spring容器管理有几种方式(推荐)

    2021-07-17 08:36:23
  • Java实现快速排序过程分析

    2023-07-27 18:40:57
  • asp之家 软件编程 m.aspxhome.com