1
/**
2
* 在C#中提供了一個專門用于簡單測試運行時間的類StopWatch,
3
* 但是貌似JDK中并沒有提供這樣的類,既然沒有提供,那么自己動手豐衣足食了。
4
* 參考網上代碼,簡單寫了一個。
5
*
6
* 后來查了以下,貌似commons-lang中已經提供了一個StopWatch的類了,
7
* 而且那個類的功能寫的更完善一些,這個類就當是一個學習的漸進過程了。
8
*
9
* @author levin
10
* @since 2011-07-07
11
*/
12
public class StopWatch {
13
private long startTime;
14
private long endTime;
15
private boolean isRunning;
16
17
/**
18
* 構造{@link #StopWatch}實例,清除所有狀態
19
*/
20
public StopWatch() {
21
reset();
22
}
23
24
/**
25
* 調用{@link #start()}以開始計時,調用該方法時,確保{@link #StopWatch}是沒有處于運行狀態,
26
* 即{@link #start()}方法還未調用,或已經調用了{@link #stop()}方法。否則會拋{@link #IllegalStateException}
27
*
28
* @return {@link #StopWatch}
29
* @since 2011-07-07
30
*/
31
public StopWatch start() {
32
if(isRunning) {
33
throw new IllegalStateException("StopWath is already started");
34
}
35
36
startTime = System.currentTimeMillis();
37
endTime = -1;
38
isRunning = true;
39
40
return this;
41
}
42
43
/**
44
* 調用{@link #stop()}方法以停止計時,調用該方法時,確保{@link #StopWatch}已經處于運行狀態,
45
* 即已經調用{@link #start()}方法,否則會拋{@link #IllegalStateException}。
46
* 調用該方法后,即可以使用{@link #getRunningTime()}、{@link #getRunningSecs()}方法以獲取運行時間
47
*
48
* @return {@link #StopWatch}
49
* @since 2011-07-07
50
*/
51
public StopWatch stop() {
52
if(isRunning) {
53
throw new IllegalStateException("StopWatch hasn't been started yet");
54
}
55
56
endTime = System.currentTimeMillis();
57
isRunning = false;
58
59
return this;
60
}
61
62
/**
63
* 獲取{@link #StopWatch}的運行時間,以毫秒為單位。如果還未調用{@link #stop()}方法,則返回當前時間
64
* 和開始時間毫秒差;否則返回{@link #StopWatch}的Watch時間。
65
*
66
* @return 獲取{@link #StopWatch}的運行時間,以毫秒為單位
67
* @since 2011-07-07
68
*/
69
public long getElapsed() {
70
if(isRunning) {
71
return System.currentTimeMillis() - startTime;
72
} else {
73
return endTime - startTime;
74
}
75
}
76
77
/**
78
* 獲取{@link #StopWatch}的運行時間,以秒為單位。其他和{@link #getElapsed()}方法類似。
79
*
80
* @return 獲取{@link #StopWatch}的運行時間,以秒為單位
81
* @since 2011-07-07
82
*/
83
public long getElapsedSecs() {
84
return TimeUnit.MILLISECONDS.toSeconds(getElapsed());
85
}
86
87
/**
88
* 獲取{@link #StopWatch}的運行時間,即調用{@link #start()}到調用{@link #stop()}的時間間隔,以毫秒為單位。
89
* 若調用此方法時,還未調用{@link #stop()}方法,則拋{@link #IllegalStateException}。
90
* 若在調用{@link #start()}方法前調用該方法,則返回0
91
*
92
* @return 獲取{@link #StopWatch}的運行時間,即調用{@link #start()}到調用{@link #stop()}的時間間隔,以毫秒為單位
93
* @since 2011-07-07
94
*/
95
public long getRunningTime() {
96
if(isRunning) {
97
throw new IllegalStateException("StopWatch hasn't been stopped yet");
98
}
99
100
return endTime - startTime;
101
}
102
103
/**
104
* 獲取{@link #StopWatch}的運行時間,以秒為單位。其他參考{@link #getRunningTime()}方法。
105
*
106
* @return 獲取{@link #StopWatch}的運行時間,以秒為單位
107
* @since 2011-07-07
108
*/
109
public long getRunningSecs() {
110
return TimeUnit.MILLISECONDS.toSeconds(getRunningTime());
111
}
112
113
114
/**
115
* 清除當前所有狀態
116
* 返回{@link #StopWatch}而不是void,是為了能實用方法鏈的模式
117
*
118
* @return {@link #StopWatch}
119
* @since 2011-07-07
120
*/
121
public StopWatch reset() {
122
startTime = -1;
123
endTime = -1;
124
isRunning = false;
125
126
return this;
127
}
128
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128
