在IntelliJIDEA中多线程并发代码的调试⽅法详解
通常来说,多线程的并发及条件断点的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 = Result().Result());
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”都返回结果之前不会进⼀步执⾏。
idea debug最后将两个线程的计算结果相加,得到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多线程并发代码的调试内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论