程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> eclipse debug多線程概述

eclipse debug多線程概述

編輯:關於JAVA

以前用到過許多線程開發,對多線程開發也算是小有點心得,但一開始多線程開發的時候,碰到很多 壁。但總得來說,有個好的工具總是能事半功倍。我用的工具是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模式進行一步步的執行,後面將逐步對知識進行應用擴展

斷點的位置

這裡有個點需要注意,斷點的位置一定要正確,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

publicclass Singleton {

   privatestatic Singleton instance;

   private Singleton() {

   }

   publicstatic Singleton getInstance() {

       if (instance == null) {

           System.out.println(instance);

           instance = new Singleton();

       }

       returninstance;

   }

}

是否是單例,打印出引用地址就可以了,測試環境用兩個線程打印

正常情況下,應該打印出來兩個同樣的值,先直接run,不用debug模式,結果如下:

查看本欄目

這一般情況下,是表現的單例,在大多數情況下,你有可能測試很多次的結果依然如此,但這段代碼 確實在多線程情況下會出問題,怎麼才能重現這個問題了,下面直接用圖演示:

最後的結果:

com.wxw.debug.Singleton@1fc0f04

com.wxw.debug.Singleton@13ded59

這裡可以看出,兩個結果不一樣,證明不是同一個對象。問題就這樣重現,是不是覺得這個工具很有 用啊。

這篇文章不是講單例模式,舉的是一個典型的例子,主要講用debug模式解決多線程情況下的問題。我 想,用debug模式,不僅僅用來解決問題,還能幫助我們理解一些知識點,這才達到了邊用邊學的好處。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved