它的关注点在,IDEA工具来调试这段多线程的代码

日期:2020-08-06 12:47:51   来源:互联网   编辑:小优   阅读人数:441
通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法。让你在多线程过程中的调试更加的有的放矢。我们将通过一个例子来学习。在这里,我编写了一个多线程程序来计

通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法。让你在多线程过程中的调试更加的有的放矢。

我们将通过一个例子来学习。在这里,我编写了一个多线程程序来计算此数学问题:100! + 100000!即:100的阶乘 + 100000的阶乘。

数学不好的同学看这里,100 阶乘就是:1 2 3 … 100 = ? ,简写为100!

它的关注点在,IDEA工具来调试这段多线程的代码(图1)

上面的代码解释

开启两个线程,“Thread 1”计算(100!和“Thread 2”计算(100000!

在main方法中启动两个线程,调用thread1.join和thread2.join,以使主线程在“线程1”和“线程2”都返回结果之前不会进一步执行。

最后将两个线程的计算结果相加,得到100! + 100000!

下面就让我们使用IntelliJ IDEA工具来调试这段多线程的代码。

Frames与Thread面板

它的关注点在,IDEA工具来调试这段多线程的代码(图2)

如果要检查其他线程的调用堆栈,则可以从下拉列表中进行选择。

它的关注点在,IDEA工具来调试这段多线程的代码(图3)

Thread面板显示当前处于活动状态的所有线程。参考上面的代码,我在thread1.join添加了一个断点。当应用程序在该断点处暂停时,我们应该在此窗格中至少看到三个线程-“main”“Thread 1”和“Thread 2”请看下面的屏幕截图您可以双击每个线程以观察其调用堆栈。

它的关注点在,IDEA工具来调试这段多线程的代码(图4)

条件断点-只挂起符合条件的线程

假设我正在解决该程序中的错误,并且我只需要在“Thread 2”开始运行时就暂停执行。这表明我需要在FactorialCalculatingThread的run方法的第一行上添加一个断点。因为我们开启的两个线程使用的是同一段代码,所以我们会遇到一个问题-使用该段代码的所有线程遇到断点都将被挂起,包括应用程序的“Thread 1”和“Thread 2”我不希望两个线程都暂停。该怎么做?

我们可以使用条件断点功能。添加断点后,右键单击它,选中“suspend”并选择“Thread”我们添加条件currentThread.getName.equals“Thread 2”,如下面的屏幕快照所示。此条件确保调试器仅在当前线程的名称为“Thread 2”时才暂停当前线程:

它的关注点在,IDEA工具来调试这段多线程的代码(图5)

现在执行调试程序,当应用暂停时,仅“Thread 2”被暂停。您可以通过以下步骤确认“Thread 1”已执行并且没有被挂起:

1.在控制台中,您可以通过日志来验证“Thread 1”已运行并退出。

它的关注点在,IDEA工具来调试这段多线程的代码(图6)

2.在“Thread”面板中,可以看到此时已经没有“Thread 1”已经运行完成了!

它的关注点在,IDEA工具来调试这段多线程的代码(图7)

在不同的IDE版本中,配置条件断点的方式可能有所不同。但是关键思想是要意识到这些功能的存在并加以使用。

本文相关词条概念解析:

线程

线程,计算机科学术语,有时也被称为轻量级进程(Light Weight Process,LWP),它是运行中的程序的调度单位。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程被包含在进程之中,是进程的一个实体,是CPU调度和分派的基本单位它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

  • 网友评论
返回顶部