时间:2021-05-19
通常来说,多线程的并发及条件断点的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; } }}上面的代码解释
下面就让我们使用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多线程并发代码的调试内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
一、多线程介绍在编程中,我们不可逃避的会遇到多线程的编程问题,因为在大多数的业务系统中需要并发处理,如果是在并发的场景中,多线程就非常重要了。另外,我们在面试的
“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则高并发≠多线程多线程是完成任务的一种方法,高并发是系统运行的一种状态,通过多线程有助于系统承受高并发
C#多线程与异步的区别详解随着拥有多个硬线程CPU(超线程、双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。本文主要是想与各位高手一同
Spring中实现多线程,其实非常简单,只需要在配置类中添加@EnableAsync就可以使用多线程。在希望执行的并发方法中使用@Async就可以定义一个线程任
Java中CountDownLatch进行多线程同步详解CountDownLatch介绍在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法:1