科百科
当前位置: 首页 科技资讯

idea调试的原理(IDEA中多线程并发代码的调试方法)

时间:2023-05-30 作者: 小编 阅读量: 1 栏目名: 科技资讯

Thread面板显示当前处于活动状态的所有线程。添加断点后,右键单击它,选中“suspend”并选择“Thread”。此条件确保调试器仅在当前线程的名称为“Thread2”时才暂停当前线程:现在执行调试程序,当应用暂停时,仅“Thread2”被暂停。但是关键思想是要意识到这些功能的存在并加以使用。

作者:zimug

原文链接:https://juejin.im/post/6857365822445191182

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

,
    推荐阅读
  • 唐三重生最后成神了没(举贤不避亲的唐三重生后)

    终极斗罗最后一册的内容已经更新完毕,小舞陨落后,唐三选择了转世重生。虽然终极斗罗30册并没有交代唐三重生的细节,但是唐三在临走前却交代了诸多事宜给后代和其他神界领导者。为了让自己的儿子和儿媳继承毁灭神王和生命神王的神位,他提出了举贤不避亲。况且二人还是夫妻,唐三将神位传给他们也算是没有辜负毁灭之神和生命女神的嘱托。因此个人以为,唐三并不会将修罗神和海神的神位让给他人继承,而是会留给小舞和自己。

  • 部编四年级语文上册21课古诗三首(部编版四年级语文上册古诗三首课文解析)

    《古诗三首》收录在人教四年级语文上册教材,需要掌握:19个汉字。明确学习目标1、有感情地朗读课文,背诵课文,默写《题西林壁》。与其父苏洵、其弟苏辙并称“三苏”。梅花和雪花相互竞争,都认为自己是最具早春特色的,而且互不认输,这就将早春的梅花与雪花之美别出心裁、生动活泼地表现出来了。

  • 高一语文必修二知识梳理(高一语文必修二知识点整理)

    1945年在苏门达腊被日寇杀害,1952年被中央人民政府追认为革命烈士。1921年第一部小说集《沉沦》问世,1923年《春风沉醉的晚上》、《薄奠》。著有散文集《海星》《竹刀》《囚绿记》等,译著有《罗亭》《鲁宾逊漂流记》等。开创了我国古代诗歌的现实主义创作传统。②相当于“而”。⑤为,成为,引申为充当,充作。引申为承担,承受。

  • 赛鲸电脑桌怎么样(赛鲸床上电脑桌使用感受)

    赛鲸在设计方面与德国Patzak,spinn等多家设计学院合作,设计追求完美,在结构和工艺方面获得多项专利。赛鲸电脑桌设计的三大特点是超易用、超耐用、超稳固。赛鲸电脑桌一个动作完成桌面角度调节。德国设计的支架结构,采用轻钢架。靠结构控制力度和状态,赛鲸电脑桌的耐用性增强。

  • 最强蜗牛吃蘑菇任务攻略(蘑菇有多少种)

    最强蜗牛吃蘑菇任务攻略获得蘑菇的方法:蘑菇宝箱,蘑菇园,每日任务,馆长的头盔,地球晚宴转盘,解锁蜗牛壳,白蝌蚪礼包,氪金礼包。每食用一定数量后可额外增加食盒容量。生命蘑菇,食用后可额外获得四维加成。

  • 啵乐乐韩国进口饮料(韩国进口啵乐乐饮料新品)

    九日冰祖食品出品的啵乐乐牛奶盒装含乳饮料目前已获得啵乐乐品牌正版授权,由山东冰祖食品股份有限公司独家代理。当然,除了可爱爆棚的卡通形象,更重要的是啵乐乐饮料的优异品质。除此之外,啵乐乐牛奶含乳饮料富含人体所需要的各种营养,同时富含维生素A、维生素B1等多种元素。啵乐乐大牌饮品,线下线上均有售目前,啵乐乐牛奶含乳饮料已经问鼎各大市场渠道,备受年轻消费者喜爱。

  • 病毒感染可以引起贫血(这种细菌感染会引发贫血等血液病)

    相关研究表明,幽门螺旋杆菌与某些血液疾病的发生是密切相关的,比如说不明原因的缺铁性贫血。我们说贫血的患者啊,有幽门螺旋杆菌的患者感染率明显高于未感染的患者。再有就是许多研究发现,根除幽门螺旋杆菌后特发性血小板减少性紫癜患者的血小板数会明显增多,并伴随血清血小板抗体,IgG水平的下降,幽门螺旋杆菌可能是部分特发性或者是原发性血小板减少症的这种疾病的致病因素之一。

  • 很甜的小短句(36句微信超火的情话短句)

    36句微信超火的情话短句❤️想牵着你的手给各位来宾敬酒❤️我什么都知道但还是想听你娓娓道来❤️我家的狗挺喜欢你的随我❤️你主动找我的时候我激动的都能做完整套广播体操❤️你是我最爱的宝贝给我甜甜的草莓牛奶也不换❤️不许说我嘴硬。

  • 一年级家长每天需要做什么(一年级家长开学最该做什么)

    就拿小学一年级新生来说,一部分是学区或摇号或其它渠道进了心仪的学校,遂了愿,满心欢喜;一部分是各种原因找找拖拖不情愿进了备份学校,心不甘,心绪惆怅。孩子学习成绩的好坏大多数来自家长的教与养,家长对孩子的教养跟上,孩子会很好。还有就是一定要记得我们上学的目的是什么,让孩子喜欢学习,学会学习,最终学有所成,这才是重中之重,是核心。所以家长在孩子成长上学会抓重点,才能保证孩子的教育正确。

  • 少儿春晚嘉年华演出(2023嘉佳卡通华夏少年少儿春晚特邀小主持人刘思琳)

    活动以权威性、广泛性为原则,旨在向全省范围内选拔具有优秀潜质的未来之星,具有积极向上风貌的儿童优秀节目和演员,最终登上《华夏少年》少儿春节联欢晚会的舞台,通过嘉佳卡通卫视的播出展示给全国人民。哈喽大拇指语言艺术特邀优秀小主持人刘思琳同学,经过严格选拔,入选嘉佳卡通《华夏少年》少儿春节联欢晚会的主持人。据悉,嘉佳卡通卫视《华夏少年》少儿春节联欢晚会将于2023年1月21日播出。