zoukankan      html  css  js  c++  java
  • eclipse debug 多线程

         

    以前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到很多壁。但总得来说,有个好的工具总是能事半功倍。我用的工具是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模式,不仅仅用来解决问题,还能帮助我们理解一些知识点,这才达到了边用边学的好处。

       

  • 相关阅读:
    10gen发布MongoDB增量备份服务
    JSON.NET 5中的架构变更
    Snowbox 2.0 发布,POP3 邮件服务器
    资源监控工具 glances
    Druid 0.2.18 发布,阿里巴巴数据库连接池
    Groovy 更新到 2.0.8 and 2.1.3
    Apache Libcloud 0.12.4 发布,统一云计算接口
    Go1.1性能测试报告(和C差距在10%以内)
    Apache Camel 2.11.0 发布,规则引擎
    2010年01月01日0时0分 总结我的2009
  • 原文地址:https://www.cnblogs.com/wxwall/p/3520561.html
Copyright © 2011-2022 走看看