以前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到很多壁。但总得来说,有个好的工具总是能事半功倍。我用的工具是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模式,不仅仅用来解决问题,还能帮助我们理解一些知识点,这才达到了边用边学的好处。
转载自:http://blog.csdn.net/binyao02123202/article/details/18361755
相关推荐
本项目主要是实现了在jni中用多线程调用java对象。代码调试通过。直接导入到eclipse即可运行
第1章主要介绍了并行计算中相关的 些基本概念, 树立读者对并行计算的基本认识;...第8章介绍了使用Eclipse进行多线程调试的方法, 并演示了通过Eclipse进行多线程调试重现ArrayList的线程不安全问题。
Eclipse 通过 CDT 调试 MI(CDT Debug MI)插件(其组件之一)支持与机器接口(Machine Interface,MI)兼容的调试器。 但 MI 调试器究竟是什么呢?通常情况下,象 ddd 和 xxgdb(请参阅 参考资料以获得链接)之类的...
案例7-4 在SWT/JFace中实现多线程效果 265 第8章 Eclipse中插件开发 273 8.1 Eclipse插件开发简介 273 案例8-1 Eclipse中插件开发初体验 274 8.2 Eclipse插件开发基本过程 277 案例8-2 Eclipse中插件...
2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在Eclipse中使用其他计算机程序..... 55 2.4.7 性能..... 60 2.5 练习概述...... 61 2.6 本章小结.......
2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在Eclipse中使用其他计算机程序..... 55 2.4.7 性能..... 60 2.5 练习概述...... 61 2.6...
2.4.3 在Eclipse中运行多窗口和多工作空间..... 51 2.4.4 改变键盘快捷键..... 54 2.4.5 定制JRE... 55 2.4.6 在Eclipse中使用其他计算机程序..... 55 2.4.7 性能..... 60 2.5 练习概述...... 61 2.6...
主要内容:● 使用JNI将原生代码连接到Java中● 使用SWIG自动生成JNI代码● 使用POSIX线程实现多线程应用● 使用POSIX套接字实现网络应用● 使用logging、GDB和Eclipse调试器进行调试● 使用Valgrind分析内存● 使用...
用POSIX和Java线程开发多线程原生应用。 用POSIXsockets开发网络原生应用。 用logging、GDB和Eclipse调试器调试原生代码。 用Valgrind分析内存问题。 用GProf测试应用性能。 用SIMD/NEON优化原生代码。
《移动开发经典丛书:Android C++高级编程:使用NDK》提供了移植、开发以及利用... 用logging、GDB和Eclipse调试器调试原生代码。 用Valgrind分析内存问题。 用GProf测试应用性能。 用SIMD/NEON优化原生代码。
《移动开发经典丛书:Android C++高级编程:使用NDK》提供了移植、开发以及利用... 用logging、GDB和Eclipse调试器调试原生代码。 用Valgrind分析内存问题。 用GProf测试应用性能。 用SIMD/NEON优化原生代码。
熟悉常用的JavaAPI,包括多线程、IO、Socket、JDBC、XML、反射等 熟练使用HTML、CSS、JavaScript、JQuery,并了解Ajax 熟练使用JSP、Servlet、javaBean进行web应用开发 熟练掌握Spring、SpringMVC、MyBatis、...
它提供了多线程,异步调用,调试插件以及ESAPIX.Bootstrapping库(依赖注入)的实现,并通过Prism 6库提供了视图模型“自动查找”。 支持的Eclipse版本 11 13.6 13.7 15.0 15.1 15.5 15.6 入门 通过NuGet安装...
Java PathFinder特别适合在多线程的程序中发现很难测试的并发缺陷。 本文所介绍的Java Pathfinder安装配置过程,主要参考JPF官方网站,并以Windows操作系统、Eclipse开发平台为基础进行配置。如使用Mac OS X等其它...
多线程 14 使用greendao 新增字段, 表找不到 字段错误 15 Byte[]与对象相互转换 16 将字节转化为对象 16 将对像转换为字节 17 项目开发中 使用DBManager 18 Android studio 中使用 greendao 18 实体 继承 实现 序列...
java7在并发编程方面,带来了很多令人激动的新功能,这将使你的应用程序具备更好的并行任务...8.8 配置Eclipse调试并发代码 327 8.9 配置NetBeans调试并发代码 330 8.10 使用MultithreadedTC测试并发代码 335
该库使扫描程序处于异步模式和多线程状态,并且可以使数据解析器在内存中(来自字符串) 创建此库的主要目的是在Arduino IDE自动完成系统中使用。建造使用maven进行构建,生成的jar包含必要的依赖项mvn包我相信这是...
多线程、 网络通信和数据库操作。 本书所精选的实例都是一线开发人员在实际项目中所积累的,并进行了技术上的解析,给出了详细的实现过程。读者通过对本书的学习,能够提高开发的能力。 本书提供了大量的源程序、...
完整的多线程框架允许多个线程并发采样和不同线程组同时采样不同功能。 缓存和离线分析/重放测试结果。 高度可扩展的核心: 可插拔采样器允许无限的测试功能。 可编写脚本的采样器(与 JSR223 兼容的语言,如Groovy...