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 * 在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}