以前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到很多壁。但总得来说,有个好的工具总是能事半功倍。我用的工具是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

个线程,按先后顺序打印出来,我是语言表达困难户,直接看图,图为动态,有点大,请耐心等待

我想这个动态应该不用多解释,也许有人会问这有什么用,这个用处可大了,我们可以控制哪个线程开始运行,哪个线程运行到某个点后,程序暂停在那里,然后其他程序再运行。最典型的例子就是单例模式在多线程下是否绝对安全(是否一定是单例),这里我也演示一下,线程不安全的单例模式代码,摘自: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模式,不仅仅用来解决问题,还能帮助我们理解一些知识点,这才达到了边用边学的好处。

eclipse debug 多线程的更多相关文章

  1. eclipse debug (调试) 学习心得

    eclipse debug (调试) 学习心得   进入debug模式:   1.设置断点   2.启动servers端的debug模式   3.运行程序,在后台遇到断点时,进入debug调试状态   ...

  2. eclipse debug模式

    eclipse debug模式 1.怎样在Eclipse中设置断点 方法/步骤 1 首先打开工程项目 2 第一种是,把鼠标移动想要设置断点的行,在行号前面空白地方双击,就会出现断点 3 第二种是,在菜 ...

  3. eclipse debug 过滤一些包

    eclipse debug java程序的时候, 我们按F5的时候,常常会进入java自带类库里,这些类库并不是我们需要debug的代码,这样会影响debug的效率,我们可以在eclipse里设置,过 ...

  4. Eclipse debug调试

    Eclipse debug调试: F5:跳入方法F6:向下逐行调试F7:跳出方法F8:直接跳转到下一个断点

  5. 转:Eclipse Debug 界面应用详解——Eclipse Debug不为人知的秘密

    今天浏览csdn,发现一文详细的描述了Eclipse Debug中的各个知识点,非常详尽!特此记录. Eclipse Debug不为人知的秘密 http://blog.csdn.net/mgoann/ ...

  6. Eclipse调试多线程代码

    Eclipse调试多线程代码 标签: eclipse 调试 多线程 | 发表时间:2013-02-16 05:51 | 作者:czjuttsw 分享到: 出处:http://blog.csdn.net ...

  7. Eclipse Debug不能热部署解决

    摘要: Eclipse Debug不能热部署代码may be out-of-synch 问题描述:Project通过ant工具编译部署到JBoss下,在使用Eclipse远程调试功...       ...

  8. eclipse debug 执行到断点处并没有停下,断点无效问题

    转自:http://blog.csdn.net/cuidiwhere/article/details/14434439 现象: 利用eclipse debug时,执行到断点处并没有停下.正常情况下,在 ...

  9. eclipse debug Liunx服务器上的svn项目

    1.本地项目提交到svn上,以保证本地代码与服务器代码相同 2.开启服务器debug端口 3.使用root账号重新部署服务器项目并监听catalina.out sh /home/p/deploy/gt ...

随机推荐

  1. cocos2d-x plist在拍照

    if(!CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("scrollicon_bg.png" ...

  2. JS实现倒计时网页自动跳转(如404页面经常使用到的)

    在web前端设计中,我们经常会遇到需要实现页面倒计时跳转的功能,例如在404页面中也会经常使用到此功能,那么如何实现呢,其实实现方法很简单,实现代码如下:<title>JS倒计时网页自动跳 ...

  3. javascript3

    计算阶乘函数:<script> function factorial(n){ var product=1; while (n>1){ product*=n;//product=pro ...

  4. php——SoapClient访问webservice

    原文:php--SoapClient访问webservice 通过SoapClient调用天气预报 <?phpheader ( "Content-Type: text/html; ch ...

  5. Installshield在安装结束时刷新系统

    原文:Installshield在安装结束时刷新系统 在OnEnd里添加代码,两种解决方案 群友kevin的解决方案 #include "ifx.h"  //Call to Win ...

  6. 利用docker搭建yii2 详细步骤

    定位镜像 在hub.docker.com 搜索yii2,并且最后定位到 https://hub.docker.com/r/codemix/yii2-base/codemix/yii2-base 然后在 ...

  7. 浅析 JavaScript 中的 函数 currying 柯里化

    原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...

  8. 苹果iOS苹果公司的手机用户都有权索赔

    大家知道.手机中的操作系统(基础软件)存储在手机固(firm,ware)之中,一般而言,手机用户自己是不能修改的. 苹果iOS手机的系统后门(服务程序)也存储在手机固件之中.手机用户自己是无法删除的. ...

  9. Oracle执行计划——Oracle 如何启用执行计划

    AUTOTRACE是一项SQL*Plus功能,自动跟踪为SQL语句生成一个执行计划并且提供与该语句的处理有关的统计.SQL*Plus AUTOTRACE可以用来替代SQL Trace使用,AUTOTR ...

  10. [C++] 获取IE代理server的账号password

    非常多程序须要使用'浏览器设置'的代理server,IE设置的代理server有可能是须要账号password的.如何编程获取浏览器设置的代理server的账号password呢? InternetQ ...