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

 更新时间:2020年08月05日 14:01:10   作者:字母哥博客  
这篇文章主要介绍了在IntelliJ IDEA中多线程并发代码的调试方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

总结

到此这篇关于在IntelliJ IDEA中多线程并发代码的调试方法的文章就介绍到这了,更多相关IDEA多线程并发代码的调试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 运算符 动力节点Java学院整理

    Java 运算符 动力节点Java学院整理

    这篇文章主要介绍了Java 运算符 动力节点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生态系统,通过配置信任库和服务器/客户端配置,实现了Spring Boot中的TLS双向认证,感兴趣的朋友一起看看吧
    2025-02-02
  • IDEA创建Servlet编写HelloWorldServlet页面详细教程(图文并茂)

    IDEA创建Servlet编写HelloWorldServlet页面详细教程(图文并茂)

    在学习servlet过程中参考的教程是用eclipse完成的,而我在练习的过程中是使用IDEA的,在创建servlet程序时遇到了挺多困难,在此记录一下,这篇文章主要给大家介绍了关于IDEA创建Servlet编写HelloWorldServlet页面详细教程的相关资料,需要的朋友可以参考下
    2023-10-10
  • java如何实时动态获取properties文件的内容

    java如何实时动态获取properties文件的内容

    这篇文章主要介绍了java如何实时动态获取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

最新评论