如何为秒表编程[关闭]
Posted
技术标签:
【中文标题】如何为秒表编程[关闭]【英文标题】:How to program for a stopwatch [closed] 【发布时间】:2012-03-20 12:40:17 【问题描述】:我从 Internet 上的某个地方找到了这个秒表 Java 代码,但它似乎不起作用。我想知道如何修复此代码以使其正常工作。它应该具有启动、停止和重置的功能,并且应该将时间显示为小时:分钟:秒.毫秒(例如:12:35:17.26)。请帮帮我。
public class StopWatch
private long startTime = 0;
private long stopTime = 0;
private boolean running = false;
public void start()
this.startTime = System.currentTimeMillis();
this.running = true;
public void stop()
this.stopTime = System.currentTimeMillis();
this.running = false;
//elaspsed time in milliseconds
public long getElapsedTime()
long elapsed;
if (running)
elapsed = (System.currentTimeMillis() - startTime);
else
elapsed = (stopTime - startTime);
return elapsed;
//elaspsed time in seconds
public long getElapsedTimeSecs()
long elapsed;
if (running)
elapsed = ((System.currentTimeMillis() - startTime) / 1000);
else
elapsed = ((stopTime - startTime) / 1000);
return elapsed;
//sample usage
public static void main(String[] args)
StopWatch s = new StopWatch();
s.start();
//code you want to time goes here
s.stop();
System.out.println("elapsed time in milliseconds: " + s.getElapsedTime());
【问题讨论】:
您所说的“不工作”到底是什么意思?您对这段代码有什么期望? 家庭作业?如果是,请添加标签。 @SérgioMichels 我希望它是一个计数计时器,其格式应为 hh:mm:ss:ms 【参考方案1】:这个example 展示了如何启动和停止javax.swing.Timer
。 here 显示了几种格式化方法。重置留作练习。
【讨论】:
【参考方案2】:根据您的作业级别,听起来您的教授希望您使用嵌套循环,而您从网络上获取的示例中没有使用嵌套循环。
我不会给你完整的答案,但它相当简单:最外面的循环是几小时,里面的一个小时是几分钟,里面的一个是几秒钟,一个里面的几秒钟是几毫秒。最里面的循环(毫秒)是打印当前时间的循环。
类似这样的:
// 24 hours in a day
for(int hours = 0; hours < 24; hours++)
// 60 mins in an hours
for(int minutes = 0; minutes < 60; minutes++)
// 60 secs in a min
for(int seconds = 0; seconds < 60; seconds++)
// 1000 ms in a sec.
for(int ms = 0; ms < 1000; ms++)
System.out.println(hours + ":" + minutes + ":" + seconds + "." + ms);
现在让它变得漂亮,并在最里面的循环中添加 1 毫秒的延迟,你就完成了! :)
【讨论】:
我想用它来创建一个JavaBean。【参考方案3】:如果你想制作秒表,你必须制作一个线程。 Java API 规定了线程的所有功能。这是必要的,否则您将无法暂停计时器。这是因为系统将整个运行时间都花在了计数上。
另外,您提供的脚本用于确定某个计算所花费的时间,而不是计时本身。
我建议你创建 2 个类,1 个用于计时器,1 个用于 GUI。制作带有标签、开始、停止和重置按钮的 GUI。
接下来,确保计时器类 EXTENDS THREAD(或实现 Runnable)并使其成为线程。接下来实现停止线程或启动线程的功能(您的开始/停止按钮)。之后重置应该很容易(只需将计时器设置回 0)。
秒表类可能如下所示:
public class Stopwatch extends Thread
private long startTime;
private boolean started;
public void startThread()
this.startTime = System.currentTimeMillis();
this.started = true;
this.start();
public void run()
while (started)
// empty code since currentTimeMillis increases by itself
public int[] getTime()
long milliTime = System.currentTimeMillis() - this.startTime;
int[] out = new int[]0, 0, 0, 0;
out[0] = (int)(milliTime / 3600000 );
out[1] = (int)(milliTime / 60000 ) % 60;
out[2] = (int)(milliTime / 1000 ) % 60;
out[3] = (int)(milliTime) % 1000;
return out;
public void stopThread()
this.started = false;
在 GUI 类中,您将开始调用“startThread”,停止调用 StopWatch.stop(); (这是一个线程函数)并让 reset 调用 reset()。
这应该让您开始使用基本的秒表。一个(不好的)使用例子:
public static void main(String[] args) throws InterruptedException
Stopwatch s = new Stopwatch();
s.startThread();
while (true)
int[] curTime = s.getTime();
System.out.println(curTime[0] + " : " + curTime[1] + " : " + curTime[2] + " : " + curTime[3]);
实际上,在线程类之外对 currentTimeMillis 进行计算会更明智。
【讨论】:
我试过使用public static void main(String[] args) StopWatch s = new StopWatch(); s.startThread(); System.out.println(s.getTime());
这个代码。但它在控制台上导致 0。为什么会这样?
如果在启动线程后直接查询getTime,它的值可能还没有改变。以上是关于如何为秒表编程[关闭]的主要内容,如果未能解决你的问题,请参考以下文章