eclipse debug多執行緒
以前用到過許多執行緒開發,對多執行緒開發也算是小有點心得,但一開始多執行緒開發的時候,碰到很多壁。但總得來說,有個好的工具總是能事半功倍。我用的工具是eclipse,在開發多執行緒時,其debug模式是能直接模擬多執行緒環境的,網上也有許多資料,但大多都不是很全。希望我能夠將自己的一些心得記錄下來,希望能幫助到還為多執行緒開發而糾結的朋友。
先寫個簡單的多執行緒測試用例:
package com.wxw.debug;
public class TestMain extends Thread {
@Override
public void run() {
System.out
}
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個執行緒,按先後順序打印出來,我是語言表達困難戶,直接看圖,圖為動態,有點大,請耐心等待
我想這個動態應該不用多解釋,也許有人會問這有什麼用,這個用處可大了,我們可以控制哪個執行緒開始執行,哪個執行緒執行到某個點後,程式暫停在那裡,然後其他程式再執行。最典型的例子就是單例模式在多執行緒下是否絕對安全(是否一定是單例),這裡我也演示一下,執行緒不安全的單例模式程式碼,摘自:
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模式,結果如下:
這一般情況下,是表現的單例,在大多數情況下,你有可能測試很多次的結果依然如此,但這段程式碼確實在多執行緒情況下會出問題,怎麼才能重現這個問題了,下面直接用圖演示:
最後的結果:
這裡可以看出,兩個結果不一樣,證明不是同一個物件。問題就這樣重現,是不是覺得這個工具很有用啊。
這篇文章不是講單例模式,舉的是一個典型的例子,主要講用debug模式解決多執行緒情況下的問題。我想,用debug模式,不僅僅用來解決問題,還能幫助我們理解一些知識點,這才達到了邊用邊學的好處。