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
