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

欢迎关注我的博客,里面有很多精品合集

本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

BGFX 渲染引擎中着色器代码的调试方法

在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封 ...

C&num;中实现并发的几种方法的性能测试

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&percnt;问题的调试方法

非常多同学在LeanCloud上遇到的不少问题,事实上能够自我解决的,如今介绍一下LeanCloud上的调试方法. LeanCloud 是通过 REST API来进行前后端分离的.这意味着当出现故障的 ...

随机推荐

linux上安装subversion

1.安装svn服务器端  yum install subversion       从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 安装成功提示:.....complete! 依次执行 ...

vsftpd 配置详解

1.默认配置: 1>允许匿名用户和本地用户登陆. anonymous_enable=YES local_enable=YES 2>匿名用户使用的登陆名为ftp或anonymous,口令为空 ...

使用ResultSet,写了一个通用的查询方法

此方法很烂,以后优化 /** * 通用的查询方法:SELECT */ @SuppressWarnings({ "unchecked", "rawtypes" } ...

使用SQL 从表中取记录

SQL 的主要功能之一是实现数据库查询. 你使用查询来取得满足特定条件的信息. 一个简单的表查询实例 SQL 查询的句法非常简单.假设有一个名为email_table 的表,包含名字和地址两个字段,要 ...

java操作redis redis连接池

redis作为缓存型数据库,越来越受到大家的欢迎,这里简单介绍一下java如何操作redis. 1.java连接redis java通过需要jedis的jar包获取Jedis连接. jedis-2.8 ...

Python004-数据处理示例:以某个数据(字段)为基准从数据中获取不同的字段行数

数据源样式如下所示: 需求: 读取文本,以第一列为基准参考系,每个基准仅输出满足需要条数的数据:不满足,全部输出. 比如,基准为 6236683970000018780,输出条数要求为 5.若文本中含 ...

VS2015右键集成TortoiseGit

先上效果 再说步骤 1.安装VS TortoiseGit等~~ 2.以外部工具方式调用TortoiseGit 3.在VS中设置右键菜单 在菜单栏下方右键,选择自定义 在弹出窗口中选择,命令->上 ...

Linux基础命令---mpstat显示cpu使用

mpstat mpstat指令用来显示cpu的使用状况,将内容显示到标准输出.处理器0是第一个.还报告了所有处理器之间的全球平均活动.mpstat命令既可以在SMP机器上使用,也可以在UP机器上使用, ...

oracle 删除用户

-- 查询用户各进程相对应的 sid.serial#. -- 注意: username 必须大写 SELECT sid,serial#,username FROM v$session WHERE us ...

内存&lpar;RAM或ROM&rpar;和FLASH存储的真正区别总结

转载自:http://blog.csdn.net/liangkaiyang/article/details/59556531.什么是内存     什么是内存呢?在计算机的组成结构中,有一个很重要的部分 ...

idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法相关推荐

  1. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法详解

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

  2. 解决在 IntelliJ IDEA 中,输入代码时突然不会自动显示下拉框提示

    解决在 IntelliJ IDEA 中,输入代码时突然不会自动显示下拉框提示 笔者的运行环境: IntelliJ IDEA 2020.1.2 (Ultimate Edition) JDK 13.0.2 ...

  3. shell中的函数及脚本调试方法

    1.函数格式 目的:将一些相对对立的代码变成函数,提供可读性和重用性,避免重复编写相同代码. 函数格式: 函数关键字:function可以省略,可不带任何参数; 符号{表示函数体的开始(可在函数名后单 ...

  4. PPT 中插入域代码公式的方法

    PPT 中插入域代码公式的方法 插入对象,选择  Word * Document,或  OpenDocument 都可以: 在新打开的页面中,选择 插入 文档部件,再选择  域代码: 在域代码选项中, ...

  5. idea ubuntu 与 快捷键冲突_解除Intellij Idea中的热键冲突

    在Intellij Idea中常用的热键包括有Ctrl+Alt+s,Ctrl+Alt+L,Ctrl+Alt+Left,Alt+F7,而这些热键已经在Gnome中注册,这就导致了热键冲突. 执行以下脚本 ...

  6. java线程开启不了_Java中多线程启动,为什么调用的是start方法,而不是run方法?...

    前言 大年初二,大家新年快乐,我又开始码字了.写这篇文章,源于在家和基友交流的时候,基友问到了,我猛然发现还真是这么回事,多线程启动调用的都是start,那么为什么没人掉用run呢?于是打开我的ide ...

  7. linux线程多参数传递参数,Linux中多线程编程并传递多个参数

    解析Linux中多线程编程并传递多个参数 Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容. Linux下的多线程编程,并将多个参数传递给线程要执行的函数. 以下是实验程序 ...

  8. ios 刷新遮罩遮罩_在Adobe XD中进行遮罩的3种方法

    ios 刷新遮罩遮罩 Are you new to Adobe XD? Or maybe you're just stuck on how to create a simple mask? Here ...

  9. python3线程池爬虫_python3爬虫中多线程的优势总结

    有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到.而且之前讲过的GIL也是对python多线程的一种限制.那么, ...

最新文章

  1. 什么是上采样和下采样
  2. 库克喜提 8 亿年终奖,2020 年整体薪酬增长 28%
  3. mysql数据库设计与应用答案智慧树_智慧树_MySQL数据库设计与应用_完整免费答案...
  4. [置顶] 再谈学习方法
  5. 微软2022服务器,​微软公开地分享了即将发布的WindowsServer 2022的特性
  6. 源码编译安装httpd服务
  7. 深度学习(五十五)tensorflow分布式训练
  8. 文件可以直接删除吗_原来手机中的这些文件可以删除,难怪手机越用越卡
  9. innerHTML 插入 script 脚本正确执行的处理方式
  10. js中的this详解
  11. springboot-jpa-querydsl
  12. SGD,Momentum,优化算法原理及实现
  13. java中style的用法
  14. 2022年G3锅炉水处理考试题库及模拟考试
  15. 美国基础设施法案对该国加密矿业会产生什么影响?
  16. 微信吸粉秘籍之人气论坛吸粉方法
  17. 几个招聘网站,智联的最垃圾
  18. 英文投稿过程中的十种状态
  19. win10 卸载cuda
  20. BLAM源码解析(五)—— 回环检测

热门文章

  1. Android Studio使用签名打包发布APP(安卓生成apk文件)
  2. VMware虚拟机安装windows8 时报错“Oxc000035a”解决办法
  3. eclipse启动慢解决方法
  4. CSS初始化(科普)
  5. 用mysql查询所以同学学号_mysql数据库练习查询41题答案
  6. spring boot 集成xxl-job 学习总结
  7. HTTP ---code错误状态码大全
  8. GDPR条例的12项重点分析
  9. 码元速率估计-速率信号法
  10. 网络安全行业岗位-漏洞挖掘工程师