此方法為 Java 內(nèi)置的方法,使用 System.currentTimeMillis 來執(zhí)行統(tǒng)計的時間(統(tǒng)計單位:毫秒)(統(tǒng)計單位:毫秒),示例代碼如下:
公司主營業(yè)務:成都做網(wǎng)站、網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)公司是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)公司推出龍湖免費做網(wǎng)站回饋大家。
public class TimeIntervalTest {
public static void main(String[] args) throws InterruptedException {
// 開始時間
long stime = System.currentTimeMillis();
// 執(zhí)行時間(1s)
Thread.sleep(1000);
// 結束時間
long etime = System.currentTimeMillis();
// 計算執(zhí)行時間
System.out.printf("執(zhí)行時長:%d 毫秒.", (etime - stime));
}
}
以上程序的執(zhí)行結果為:
執(zhí)行時長:1000 毫秒.
方法二:System.nanoTime
此方法為 Java 內(nèi)置的方法,使用 System.nanoTime 來統(tǒng)計執(zhí)行時間(統(tǒng)計單位:納秒),它的執(zhí)行方法
檢測一個JAVA程序的運行時間方法: long startTime = System.currentTimeMillis();//獲取當前時間//doSomeThing(); //要運行的java程序long endTime = System.currentTimeMillis();System.out.println("程序運行時間:"+(endTime-startTime)+"ms");
最簡單的就是直接獲取開始時間、結束時間,計算時間差
public?class?Demo?{
public?static?void?main(String[]?args)?{
long?startTime?=?System.currentTimeMillis();????//獲取開始時間
doSomething();????//測試的代碼段
long?endTime?=?System.currentTimeMillis();????//獲取結束時間
System.out.println("程序運行時間:"?+?(endTime?-?startTime)?+?"ms");????//輸出程序運行時間
}
}
將每個 Thread 新建之后賦值給一個引用,如 Thread t = new Thread(......);
然后調(diào)用 t.join(); 這個方法會等待當前線程執(zhí)行完。就是下面這樣:
long?t1?=?System.currentTimeMillis();
Thread[]?threads?=?new?Thread[20];
for?(int?i?=?0;?i??20;?i++)?{
threads[i]?=?new?Thread(new?Runnable()?{
public?void?run()?{
try?{
System.out.println(Version[Low/High]Effective.getInstance());
}?catch?(Exception?e)?{
e.printStackTrace();
}
}
});
threads[i].start();
}
for?(int?i?=?0;?i??20;?i++)?{
threads[i].join();
}
long?t2?=?System.currentTimeMillis();
System.out.println("耗時:"?+?(t2?-?t1)?+?"毫秒");
至于雙重檢查為什么要加?volatile,是因為?volatile 關鍵字在 JDK5 之后,保證了被其修飾的變量的可見性(JDK5 之前的版本是不可以的)。Java語言規(guī)范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比(如果與原始變量不一致則修改原始變量)。這樣當多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。而volatile賦予了變量可見性——禁止編譯器對成員變量進行優(yōu)化,它修飾的成員變量在每次被線程訪問時,都強迫從內(nèi)存中重讀該成員變量的值;而且,當成員變量發(fā)生變化時,強迫線程將變化值回寫到共享內(nèi)存,這樣在任何時刻兩個不同線程總是看到某一成員變量的同一個值,這就是保證了可見性。
所以,假設你的?private static volatile VersionHighEffective ?me=null; 沒有?volatile 關鍵字(那么就是?private static VersionHighEffective ?me=null;),假設線程 t1 已經(jīng) new 了一個?VersionHighEffective 實例,但是這個實例目前可能只是保存在 t1 的“范圍”里,還沒有被寫到主存;此時線程 t2 去執(zhí)行這段代碼:
if(me==null){
synchronized?(VersionHighEffective.class)?{
if?(me?==?null)?{
Thread.sleep(500);
me?=?new?VersionHighEffective();
}
}
}
很明顯 t2 從主存那訪問到的 me 仍然是 null,所以最后 t2 又去 new 了一個?VersionHighEffective,這樣就不是單例了。所以,加上?volatile 修飾,每次的修改后的變量都會強迫立即寫到主存,那么前面的問題就不存在了。