StopWatch类

本文介绍了如何在C#中实现一个简单的计时器类,类似于Java中的StopWatch,提供了启动、停止和获取运行时间等功能。通过对比,展示了开源库Commons-Lang中的StopWatch类的完善之处。本教程旨在帮助开发者理解并实践计时器的基本概念和使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1ExpandedBlockStart.gif/**
  2 * 在C#中提供了一个专门用于简单测试运行时间的类StopWatch,
  3 * 但是貌似JDK中并没有提供这样的类,既然没有提供,那么自己动手丰衣足食了。
  4 * 参考网上代码,简单写了一个。
  5 * 
  6 * 后来查了以下,貌似commons-lang中已经提供了一个StopWatch的类了,
  7 * 而且那个类的功能写的更完善一些,这个类就当是一个学习的渐进过程了。
  8 * 
  9 * @author levin
 10 * @since 2011-07-07
 11 */
 12ExpandedBlockStart.gifpublic class StopWatch {
 13    private long startTime;
 14    private long endTime;
 15    private boolean isRunning;
 16    
 17ExpandedSubBlockStart.gif    /**
 18     * 构造{@link #StopWatch}实例,清除所有状态
 19     */
 20ExpandedSubBlockStart.gif    public StopWatch() {
 21        reset();
 22    }
 23    
 24ExpandedSubBlockStart.gif    /**
 25     * 调用{@link #start()}以开始计时,调用该方法时,确保{@link #StopWatch}是没有处于运行状态,
 26     * 即{@link #start()}方法还未调用,或已经调用了{@link #stop()}方法。否则会抛{@link #IllegalStateException}
 27     * 
 28     * @return {@link #StopWatch}
 29     * @since 2011-07-07
 30     */
 31ExpandedSubBlockStart.gif    public StopWatch start() {
 32ExpandedSubBlockStart.gif        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    
 43ExpandedSubBlockStart.gif    /**
 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     */
 51ExpandedSubBlockStart.gif    public StopWatch stop() {
 52ExpandedSubBlockStart.gif        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    
 62ExpandedSubBlockStart.gif    /**
 63     * 获取{@link #StopWatch}的运行时间,以毫秒为单位。如果还未调用{@link #stop()}方法,则返回当前时间
 64     * 和开始时间毫秒差;否则返回{@link #StopWatch}的Watch时间。
 65     * 
 66     * @return 获取{@link #StopWatch}的运行时间,以毫秒为单位
 67     * @since 2011-07-07
 68     */
 69ExpandedSubBlockStart.gif    public long getElapsed() {
 70ExpandedSubBlockStart.gif        if(isRunning) {
 71            return System.currentTimeMillis() - startTime;
 72ExpandedSubBlockStart.gif        } else {
 73            return endTime - startTime;
 74        }
 75    }
 76    
 77ExpandedSubBlockStart.gif    /**
 78     * 获取{@link #StopWatch}的运行时间,以秒为单位。其他和{@link #getElapsed()}方法类似。
 79     * 
 80     * @return 获取{@link #StopWatch}的运行时间,以秒为单位
 81     * @since 2011-07-07
 82     */
 83ExpandedSubBlockStart.gif    public long getElapsedSecs() {
 84        return TimeUnit.MILLISECONDS.toSeconds(getElapsed());
 85    }
 86    
 87ExpandedSubBlockStart.gif    /**
 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     */
 95ExpandedSubBlockStart.gif    public long getRunningTime() {
 96ExpandedSubBlockStart.gif        if(isRunning) {
 97            throw new IllegalStateException("StopWatch hasn't been stopped yet");
 98        }
 99        
100        return endTime - startTime;
101    }
102    
103ExpandedSubBlockStart.gif    /**
104     * 获取{@link #StopWatch}的运行时间,以秒为单位。其他参考{@link #getRunningTime()}方法。
105     * 
106     * @return 获取{@link #StopWatch}的运行时间,以秒为单位
107     * @since 2011-07-07
108     */
109ExpandedSubBlockStart.gif    public long getRunningSecs() {
110        return TimeUnit.MILLISECONDS.toSeconds(getRunningTime());
111    }
112    
113    
114ExpandedSubBlockStart.gif    /**
115     * 清除当前所有状态
116     * 返回{@link #StopWatch}而不是void,是为了能实用方法链的模式
117     * 
118     * @return {@link #StopWatch}
119     * @since 2011-07-07
120     */
121ExpandedSubBlockStart.gif    public StopWatch reset() {
122        startTime = -1;
123        endTime = -1;
124        isRunning = false;
125        
126        return this;
127    }
128}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值