Eclipse debug 多线程

摘要:
调试模式可以直接模拟多线程环境。首先,编写一个简单的多线程测试用例:控制台打印两行Helloworld。接下来,我们将演示如何使用调试模式逐步执行。稍后,我们将逐步应用知识来扩展断点的位置。这里有一点需要注意。在run方法或运行后调用的方法中,我在这里添加了一段代码,以更清楚地显示这里执行了哪个线程。

     

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

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

package com.wxw.debug;

     

publicclass TestMain extends Thread {

     

    @Override

    publicvoid run() {

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

    }

        

    publicstaticvoid main(String[] args) {

        TestMain t1 = new TestMain();

        TestMain t2 = new TestMain();

        t1.start();

        t2.start();

    }

}

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

Hello world

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

  1. 断点的位置

Eclipse debug 多线程第1张

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

Eclipse debug 多线程第2张

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

Eclipse debug 多线程第3张

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

Thread-0 hello world

Thread-1 hello world

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

Eclipse debug 多线程第4张

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

publicclass Singleton {

    privatestatic Singleton instance;

   

    private Singleton() {

    }

   

    publicstatic Singleton getInstance() {

        if (instance == null) {

            System.out.println(instance);

            instance = new Singleton();

        }

        returninstance;

    }

}

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

Eclipse debug 多线程第5张

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

Eclipse debug 多线程第6张

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

Eclipse debug 多线程第7张

最后的结果:

  com.wxw.debug.Singleton@1fc0f04

com.wxw.debug.Singleton@13ded59

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

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

   

免责声明:文章转载自《Eclipse debug 多线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]ODAC 应用技巧 (一)使用 ODAC 的 Net 方式CSS段落对齐方式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Football 南邮NOJ网络选拔赛2082

Football 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 246            测试通过 : 59  题目描述 现在你是一名足球经理,你的队伍将参加“南邮杯”的比赛。然而你拥有预知未来的能力,你可以预见你的队伍接下来进行的n场比赛每场的进球数和失球...

WatchDog工作原理

Android系统中,有硬件WatchDog用于定时检测关键硬件是否正常工作,类似地,在framework层有一个软件WatchDog用于定期检测关键系统服务是否发生死锁事件。 watchdog的源码很简单,主要有两个功能 1监控system_server中几个关键的锁,原理就是在android_fg线程中尝试加锁 2监控几个常用线程的执行时间,原理就是在...

读写锁shared_lock/shared_mutex

何为读写锁   相比互斥锁,读写锁允许更高的并行性,互斥量要么锁住状态要么不加锁,而且一次只有一个线程可以加锁。读写锁可以有三种状态: 读模式加锁状态; 写模式加锁状态; 不加锁状态;   只有一个线程可以占有写模式的读写锁,但是可以有多个线程占有读模式的读写锁。读写锁也叫做“共享-独占锁”,当读写锁以读模式锁住时,它是以共享模式锁住的;当它以写模式锁...

java线程占多大的内存,占哪里的内存?

说到线程,我们往往想到的是线程安全、线程池,很少会去考虑线程的内存。 那么一个线程占用多大的内存?占用哪里的内存呢? 占多大的内存? jdk1.4默认的单个线程是占用256k的内存 jdk1.5+默认的单个线程是占用1M的内存 可以通过-Xss参数设定,一般默认就好 占哪里的内存? 这TM还用问?java线程当然是占用jvm的内存啊!(╯‵□′)╯︵┻━┻...

Linux下MySQL所在磁盘,线程,内存的配置

磁盘日志策略 /etc/fstab中可以进行正面的配置(其性能按从上到下的顺序排列) data=writeback 只有元数据写入日志.元数据写入与数据写入并不同步.这是最快的配置,对innodb来说通常是安全的,innodb有自己的事务日志.唯一例外是当系统崩溃.frm文件损坏了. data=ordered 这个选项也只会记录元数据,但是会提供一些一致性...

C# 线程手册 第二章 .NET 中的线程 终止/等待线程

Abort()方法可以用来终止当前线程。不论何种情况下你想终止线程,比如线程执行了太长时间或者用户取消了之前的决定,Abort()方法都很重要。在一个花费很长时间的搜索进程中你可能想使用这个方法。一个搜索引擎可能在继续运行但是用户已经看到了他们想要的结果,所以用户会终止搜索引擎所运行的线程。当在一个线程外调用Abort()方法时,会引发一个ThreadAb...