转自: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模式进行一步步的执行,后面将逐步对知识进行应用扩展
- 断点的位置
这里有个点需要注意,断点的位置一定要正确,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模式,不仅仅用来解决问题,还能帮助我们理解一些知识点,这才达到了边用边学的好处。
相关推荐
C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called. ...C++ thread退出线程 多线程 子线程控制退出主线程 window VS2017 Debug Error! Abort() has been called.
Run_Debug
C多线程调试方法
请大家帮忙解决一下,是关于线程同步的问题,我想了很久,问题是运行时出现白屏
在我之前解释了flask如何支持多线程主要通过两个类来实现,LocalStack和Local,在Local中有两个属性,__storage__和__ident_func__,后者用来获取线程id,从而区分不同线程发来的请求 这次要说的是flask如何开启多线程 先...
主要介绍了在IntelliJ IDEA中多线程并发代码的调试方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
本文结合自身调试多线程经验总结的。给使用GDB调试多线程的同仁们提供点思路
DEBUG程序中的“E”命令,将字节数据送入地址单元中。 用直接和寄存器间接寻址方式实现单元中的数据相加,并将运算结果存放在指定单元中。 实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的...
DEBUG的使用方法,非常详细,学习微机的人可以参考一下。
3、在Debug 进入内表时,可以通过右侧的工具按钮来对内表内容的增删改。 4、若DEBUG想返回上一步重新执行操作,可以通过鼠标右键选中想返回的行,点击“转到语句”进行操作。 5、Condition point 6、Watchpoint 7、...
debug欣赏debug欣赏debug欣赏debug欣赏debug欣赏
debug命令大全,debug调试程序的使用及详细的使用方法。
为此,我特意在少有信息中和代码实验验证完成基于vscode对deepspeed进行debug方法。特别的,该方式不仅适合deepspeed命令debug,也适用torchrun命令debug,更能延伸其它命令debug模式。本文内容分为三部分,第一部分...
DebugView帮助文档 DebugView使用说明 DebugView介绍DebugView帮助文档 DebugView使用说明 DebugView介绍DebugView帮助文档 DebugView使用说明 DebugView介绍DebugView帮助文档 DebugView使用说明 DebugView介绍
apollo 调试方法
NS2调试工具tcldebug软件及安装方法
debug下的调试方法 eclipse快捷键大全 很好很强大
Go升级至1.20.4,使用Goland进行Debug时,断点无法调试
debug.logdebug.log
H3C Debug信息详解基础常识.pdf MSDP模块Debug命令详解.pdf ospf debug命令.pdf PIM DM模块Debug命令.pdf RADUIS模块Debug命令详解.pdf Ripng模块Debug命令详解.pdf Rip模块Debug命令详解.pdf SNMP Debug命令.pdf ...