Stopwatch主要用於時間統計吧
其實不光Guava,Apache Commons, 以及Spring Utils工具集都有StopWatch這個工具。
Guava的Stopwatch的例子代碼TestStopWatch.java
package com.cqsym.lmdw1.testguava;
import com.google.common.base.Stopwatch;
import java.util.concurrent.TimeUnit;
public class TestStopWatch {
public static void main(String[] args) {
System.out.println("Hello World!");
Stopwatch stopwatch = Stopwatch.createUnstarted();
stopwatch.start();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
stopwatch.stop();
System.out.println(stopwatch.elapsed());
System.out.println(stopwatch.elapsed().toMillis());
stopwatch.start();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println(stopwatch.elapsed().toMillis());
System.out.println(stopwatch.elapsed().toNanos());
System.out.println(stopwatch.elapsed().toSeconds());
System.out.println(stopwatch.elapsed().toMinutes());
System.out.println(stopwatch.elapsed().toHours());
System.out.println(stopwatch.elapsed().toDays());
System.out.println(stopwatch.elapsed().toMillisPart());
System.out.println(stopwatch.elapsed().toNanosPart());
System.out.println(stopwatch.elapsed().toSecondsPart());
System.out.println(stopwatch.elapsed().toMinutesPart());
System.out.println(stopwatch.elapsed().toHoursPart());
System.out.println(stopwatch.elapsed().toDaysPart());
System.out.println(stopwatch.elapsed().getNano());
System.out.println(stopwatch.elapsed().getSeconds());
System.out.println(stopwatch.elapsed().getNano());
}
}
説明:
Guava的Stopwatch的常見api。
Stopwatch.createUnstarted()創建不啓動統計,後面單獨start();
Stopwatch.createStarted()創建並啓動統計;
Stopwatch.start()啓動統計;
Stopwatch.stop()停止統計;
stopwatch.elapsed()用户獲取統計的數據,屬於Duration可以存儲(日,時,分,秒)也可以理解(幾天幾小時幾分鐘幾秒鐘)。
Spring工具集的StopWatch例子代碼SpringStopWatchDemo.java
package com.cqsym.lmdw1.testguava;
import org.springframework.util.StopWatch;
import java.util.concurrent.TimeUnit;
public class SpringStopWatchDemo {
public static void main(String[] args) {
System.out.println("Hello World!");
StopWatch stopwatch = new StopWatch();
stopwatch.start();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
stopwatch.stop();
System.out.println(stopwatch.currentTaskName());
System.out.println(stopwatch.getId());
System.out.println(stopwatch.getTaskInfo());
System.out.println(stopwatch.getTotalTimeMillis());
System.out.println(stopwatch.getTotalTimeNanos());
System.out.println(stopwatch.getTotalTimeSeconds());
System.out.println(stopwatch.getTotalTime(TimeUnit.MILLISECONDS));
stopwatch.start();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("-----------------------------------------");
System.out.println(stopwatch.currentTaskName());
System.out.println(stopwatch.getId());
System.out.println(stopwatch.getTaskInfo());
System.out.println(stopwatch.getTotalTimeMillis());
System.out.println(stopwatch.getTotalTimeNanos());
System.out.println(stopwatch.getTotalTimeSeconds());
System.out.println(stopwatch.getTotalTime(TimeUnit.MILLISECONDS));
}
}
説明:
Spring工具集中的StopWatch和Guava使用還是有差異,特別是Spring工具集中的StopWatch他執行stop後,再次start是單獨的記時。還有一個重點就是spring工具集的StopWatch他在創建時可以傳入id,在啓動時可以可以start傳入taskName任務名稱。
1他的統計和和guava的統計不一樣,他的stop後再次start是單獨統計時間;
2他可以在創建時傳入id,還可以在執行任務和方法時傳入任務名稱;
Commons的lang3包StopWatch例子CommonsStopWatchDemo.java
package com.cqsym.lmdw1.testguava;
import org.apache.commons.lang3.time.StopWatch;
import java.util.concurrent.TimeUnit;
public class CommonsStopWatchDemo {
public static void main(String[] args) {
System.out.println("Hello World!");
StopWatch stopwatch = new StopWatch();
stopwatch.start();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
stopwatch.stop();
System.out.println(stopwatch.getNanoTime());
System.out.println(stopwatch.getMessage());
System.out.println(stopwatch.getStartInstant());
System.out.println(stopwatch.getStopInstant());
//System.out.println(stopwatch.getSplitDuration());
stopwatch.reset();
stopwatch.start();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
//stopwatch.stop();
System.out.println("-----------------------------------------");
System.out.println(stopwatch.getNanoTime());
System.out.println(stopwatch.getMessage());
System.out.println(stopwatch.getStartInstant());
System.out.println(stopwatch.getStopInstant());
stopwatch.suspend();
System.out.println("Sleep 5秒!");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("==========================================");
stopwatch.resume();
for (int i = 0; i < 3; i++) {
System.out.println(i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
stopwatch.stop();
System.out.println(stopwatch.getNanoTime());
System.out.println(stopwatch.getMessage());
System.out.println(stopwatch.getStartInstant());
System.out.println(stopwatch.getStopInstant());
}
}
説明:
他也與上面的2個都不一樣,他stop後,要再次使用,需要reset後再次start;在創建計時器時可以傳入一個message來區。
還有就是他有暫停和恢復。【suspend()和resume()】。還支持split()分割,代碼如下:
StopWatch stopWatch = new StopWatch();
// 開始計時
stopWatch.start();
System.out.println("開始計時...");
// 模擬一些工作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 第一個split點
stopWatch.split();
System.out.println("Split 1 時間: " + stopWatch.getSplitTime() + "ms");
System.out.println("Split 1 格式化: " + stopWatch.formatSplitTime());
// 繼續工作
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 第二個split點
stopWatch.split();
System.out.println("Split 2 時間: " + stopWatch.getSplitTime() + "ms");
System.out.println("Split 2 格式化: " + stopWatch.formatSplitTime());
// 繼續工作
try {
Thread.sleep(300);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 停止計時
stopWatch.stop();
System.out.println("總時間: " + stopWatch.getTime() + "ms");
System.out.println("總時間格式化: " + stopWatch.formatTime());