在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版本中,配置条件断点的方式可能有所不同。但是关键思想是要意识到这些功能的存在并加以使用。
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
在IntelliJ IDEA中多线程并发代码的调试方法的更多相关文章
- BGFX 渲染引擎中着色器代码的调试方法
在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封 ...
- C#中实现并发的几种方法的性能测试
C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...
- Delphi 中多线程同步的一些处理方法
Delphi 中多线程同步的一些处理方法 当创建了多个线程,并且多个线程都要访问同一资源,,就有可能出现混乱,于是用Synchronize来控制,使同一时间只有一个线程使用那部分资源,Synchr ...
- Cocos2d-x优化中多线程并发访问
多线程并发访问在Cocos2d-x引擎中用的不是很多,这主要是因为中整个结构设计没有采用多线程.源自于Objective-C的Ref对象,需要使用AutoreleasePool进行内存管理,Autor ...
- Cocos2d-x优化中多线程并发訪问
多线程并发訪问在Cocos2d-x引擎中用的不是非常多,这主要是由于中整个结构设计没有採用多线程. 源自于Objective-C的Ref对象,须要使用AutoreleasePool进行内存管理,Aut ...
- Java中多线程并发体系知识点汇总
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
- WinForm中执行JS代码(多种方法)
方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址 http://www.microsoft.com/downloads/details ...
- linux设备驱动程序第四部分:从如何定位oops对代码的调试方法,驱动线
在一个我们谈到了如何编写一个简单的字符设备驱动程序,我们不是神,编写肯定会失败的代码,在这个过程中,我们需要继续写代码调试.在普通c应用.我们经常使用printf输出信息.或者使用gdb要调试程序,然 ...
- LeanCloud SDK 中秒杀70%问题的调试方法
非常多同学在LeanCloud上遇到的不少问题,事实上能够自我解决的,如今介绍一下LeanCloud上的调试方法. LeanCloud 是通过 REST API来进行前后端分离的.这意味着当出现故障的 ...
随机推荐
- java 数据结构(十):Collection子接口:Set接口
1. 存储的数据特点:无序的.不可重复的元素具体的: 以HashSet为例说明:1. 无序性:不等于随机性.存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的.2. 不可重复性 ...
- How to change the text color in the terminal
You can open the file ~/.bashrc and then choose the force_color_prompt=yes otherwise, you can change ...
- 京东秋招提前批初试--java开发工程师
1,自我介绍,学过的课程有哪些 2,介绍一下java的内存结构和内存模型(jvm和jmm) 3,对于NIO有没有了解?作用是什么?(基于通道和缓冲区的I/O方式,用的是DirectByteBuffer ...
- 关于jquery.unobtrusive-ajax.js 回调函数无效 的解决办法
今天新项目的时候写MVC的时候使用到了Ajax.BeginForm,发现它的回调函数怎么都不响应,最后在网上查找了相关资料跟自己写的一些代码测试, 总算找到了原因:jquery.unobtrusive ...
- bzoj2160拉拉队排练
bzoj2160拉拉队排练 题意: 给一个字符串,求最长的k个回文子串(此处回文子串长度必须为奇数)长度的乘积.字符串长度≤1000000 题解: 先用manacher预处理出第i个字符为中心的最长回 ...
- JMeter-一个接口的返回值作为输入传给其他接口
背景: 在用JMeter写接口case,遇到一种情况,接口1查看列表接口,接口2查看详情接口,接口2需要传入接口1列表的第一条数据的id 解决方案: 首先放一下总体截图 具体步骤 1-新建一个Thre ...
- 【一起学系列】之模板方法:写SSO我只要5分钟
意图 定义一个操作中的算法的骨架,将一些步骤延迟到子类中. Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 模板方法模式的诞生 模板方法模式为我们提供了一 ...
- Mysql数据库搭建集群---实现主从复制,读写分离
参考博客:https://blog.csdn.net/xlgen157387/article/details/51331244 A. 准备:多台服务器,且都可以互相随意访问root用户,都可以随意进 ...
- GPO - Folder Mapping via GPO
Create a Group Policy on AD DC Server. The GPO policy will come into effect on the next login, or us ...
- Ethical Hacking - NETWORK PENETRATION TESTING(18)
Session Hijacking What if the user uses the "remember me" feature? If the user uses this f ...