`
程序员是怎么炼成的
  • 浏览: 33602 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

debug 无法进入 run方法,多线程 debug

    博客分类:
  • java
阅读更多

转自:http://www.cnblogs.com/wxwall/p/3520561.html

 

 

 

 

以前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到很多壁。但总得来说,有个好的工具总是能事半功倍。我用的工具是eclipse,在开发多线程时,其debug模式是能直接模拟多线程环境的,网上也有许多资料,但大多都不是很全。希望我能够将自己的一些心得记录下来,希望能帮助到还为多线程开发而纠结的朋友。

先写个简单的多线程测试用例:

package com.wxw.debug;

     

public class TestMain extends Thread {

     

    @Override

    public void run() {

        System.out.println("hello world");

    }

        

    public static void main(String[] args) {

        TestMain t1 = new TestMain();

        TestMain t2 = new TestMain();

        t1.start();

        t2.start();

    }

}

这段代码,控制台打印出两行

Hello world

接下来,将示范怎么样使用debug模式进行一步步的执行,后面将逐步对知识进行应用扩展

  1. 断点的位置

这里有个点需要注意,断点的位置一定要正确,run方法或者run以后调用的方法里,否则的话,程序跑完了,debug模式里也只有一个主线程在跑,好了,直接看结果。

在这里我们看到了两个线程已经起来了,在debug模式里也注明了Thread-0和Thread-1,在这里我再加段代码来更明显的显示哪个线程执行到了这里。

加上这段代码后,打印出来的结果就是

Thread-0 hello world

Thread-1 hello world

现在我需要将Thread-1这个线程先打印出来结果,也就是将线程可控,我想先执行哪个都行,怎么办了?为了更加明显,我多加几个线程,总共5个线程,按先后顺序打印出来,我是语言表达困难户,直接看图,图为动态,有点大,请耐心等待

我想这个动态应该不用多解释,也许有人会问这有什么用,这个用处可大了,我们可以控制哪个线程开始运行,哪个线程运行到某个点后,程序暂停在那里,然后其他程序再运行。最典型的例子就是单例模式在多线程下是否绝对安全(是否一定是单例),这里我也演示一下,线程不安全的单例模式代码,摘自:http://www.blogjava.net/kenzhh/archive/2013/03/15/357824.html

public class Singleton {

    private static Singleton instance;

   

    private Singleton() {

    }

   

    public static Singleton getInstance() {

        if (instance == null) {

            System.out.println(instance);

            instance = new Singleton();

        }

        return instance;

    }

}

是否是单例,打印出引用地址就可以了,测试环境用两个线程打印

正常情况下,应该打印出来两个同样的值,先直接run,不用debug模式,结果如下:

这一般情况下,是表现的单例,在大多数情况下,你有可能测试很多次的结果依然如此,但这段代码确实在多线程情况下会出问题,怎么才能重现这个问题了,下面直接用图演示:

最后的结果:

  com.wxw.debug.Singleton@1fc0f04

com.wxw.debug.Singleton@13ded59

这里可以看出,两个结果不一样,证明不是同一个对象。问题就这样重现,是不是觉得这个工具很有用啊。

这篇文章不是讲单例模式,举的是一个典型的例子,主要讲用debug模式解决多线程情况下的问题。我想,用debug模式,不仅仅用来解决问题,还能帮助我们理解一些知识点,这才达到了边用边学的好处。

分享到:
评论

相关推荐

    flask开启多线程的具体方法

    要让 Flask 应用程序支持多线程,可以通过调整 `app.run()` 方法中的参数来实现。下面是具体步骤: ##### 1. 修改 `app.run()` 方法 在 Flask 中,`app.run()` 方法是启动开发服务器的主要方式。要开启多线程,需要...

    多线程并发代码的IntelliJ IDEA中调试方法.docx

    ### 多线程并发代码的IntelliJ IDEA中调试方法 #### 一、代码解析 在探讨如何使用IntelliJ IDEA进行多线程代码调试之前,先了解代码本身的功能。 **1.1 代码功能** 代码的主要目的是计算两个非常大的数字的阶乘...

    解决pycharm中的run和debug失效无法点击运行

    在使用PyCharm进行Python开发时,可能会遇到Run和Debug按钮失效的问题,导致无法正常启动或调试项目。本文将详细解析这个问题的成因以及解决方法。 首先,Run和Debug按钮变灰通常是因为PyCharm遇到了某种阻碍其正常...

    在Eclipse中使用debug(Eclipse调试常用技巧)

    7. 多线程调试:Eclipse允许开发者同时调试多个线程。在“Threads”视图中可以查看所有线程的状态,进行线程间的切换,甚至可以在某个特定线程上设置断点。 8. 异常处理和断点条件:Eclipse允许设置断点在抛出特定...

    debug详解计算机debug的较详细资料

    3. **多线程调试**:多线程编程中的死锁、竞态条件等是常见问题,调试时需关注线程同步和互斥,如使用线程可视化工具(如Java的VisualVM)。 4. **网络调试**:对于网络相关的应用,抓包工具(如Wireshark)可以...

    使用eclipse远程debug .

    - **多线程调试**:Eclipse允许同时查看和控制多个线程,这对于多线程应用的调试非常有帮助。 - **条件断点**:可以在断点处设置条件,只有满足特定条件时才会停止执行。 - **监视表达式**:在Watch视图中添加...

    详解Eclipse中的Debug技术

    2. Threads视图:显示所有运行的线程,可以切换和暂停其他线程,方便在多线程环境中调试。 七、异常处理 当程序抛出异常时,Eclipse会自动进入Debug模式,并在抛出异常的代码行处设置临时断点,帮助你快速定位问题...

    Eclipse_Debug_调试技巧入门_Eclipse_Debug_调试技巧入门_

    例如,F5用于单步进入方法,F6单步过一个语句,F7单步返回,F8继续执行到下一个断点。此外,Ctrl+Shift+F5可以重启调试会话,Alt+Shift+R可以重命名当前断点,Ctrl+Shift+B可以快速切换断点状态。 通过以上介绍,你...

    多线程向线程函数传递多个参数实例

    在编程中,尤其是在Windows应用程序开发中,多线程技术经常被用来提高程序的并发性和执行效率。MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的C++库,用于构建Windows应用程序。在这个实例中,我们...

    debug详解.docx

    - **Suspend Thread**:多线程环境下,只暂停当前线程。 - **Suspend VM**:暂停整个虚拟机。 在调试期间,你可以在Variables视图中查看并修改变量的值,这有助于快速定位问题。若在调试过程中修改了代码,保存并...

    Eclipse 的 Debug 介绍与技巧

    通过选择“Run As”->“Debug”菜单项来启动调试模式。 - **3.3.2 远程调试**:除了本地调试外,Eclipse还支持远程调试,即在远程服务器上运行程序的同时在本地机器上进行调试。这种方式特别适合于部署在服务器上的...

    myeclipse中debug class文件

    6. **线程管理**:如果应用程序涉及多线程,MyEclipse还提供了线程切换和挂起的功能,帮助开发者更好地理解多线程的执行情况。 7. **异常断点**:除了在代码行设置断点外,还可以设置异常断点。一旦特定类型的异常...

    python多线程下载ts文件并合并mp4

    在Python编程中,多线程是一种常见的并发执行方式,尤其在处理大文件下载或I/O密集型任务时,可以显著提高程序效率。本资源提供的工具就是利用Python的多线程技术来实现ts视频片段的下载,并最终将这些片段合并成一...

    Debug与Release版本的区别

    关于运行时库的选择,/MDd和/MD用于Debug和Release版本,分别链接到多线程调试DLL版本和多线程DLL版本的C++运行时库。这些库在处理内存分配、异常处理等方面存在差异,Debug版本的库会进行更多的错误检查,而Release...

    eclipse的debug技术

    线程视图显示了当前运行的所有线程,这对于多线程编程尤其有用。变量视图则列出当前作用域内的变量及其值,表达式视图允许你输入Java表达式并立即查看结果。 调试过程中,Eclipse提供了单步执行的功能。F8键可以...

    在Intellij IDEA中使用Debug(图文教程)

    2. 多线程调试:IDEA支持同时调试多个线程,可以查看并控制每个线程的状态。 3. 回退断点:Drop Frame功能允许你撤销最近的执行步骤,回退到之前的断点状态。 4. 中断Debug:使用Stop按钮可结束Debug会话。 5. ...

    Eclipse的debug技术

    9. **线程操作**:在多线程环境中,Eclipse允许切换和暂停不同的线程,以便分析不同线程的状态。 10. **数据透视图(DataTips)**:在代码中悬停鼠标时,可以显示一个临时的数据透视图,显示选定变量或表达式的值。...

    Eclipse调试器和Debug视图

    4. **挂起和恢复线程(Suspending and Resuming Threads)**:能够控制线程的执行状态,这对于多线程应用尤为重要。 此外,Eclipse还支持对远程机器上的应用程序进行调试,极大地扩展了其应用场景。值得一提的是,...

    ideadebug笔记.7z

    IDEA支持多线程调试,可以通过“Threads”窗口查看并切换不同线程,理解并发执行的逻辑。 9. **内存监视** 使用“Memory View”插件可以监控内存使用情况,有助于查找内存泄漏。 10. **断点过滤** 在...

    gdb debug 學習文檔

    7. 多线程调试:gdb 支持多线程调试,允许用户在多线程程序中进行调试。 8. 调试器扩展:gdb 支持扩展调试器的功能,例如添加新的命令、变量类型等。 9. 调试器插件:gdb 支持插件机制,允许用户开发和安装插件,...

Global site tag (gtag.js) - Google Analytics