Java System.currentTimeMillis()问题

时间:2011-09-21 21:08:35

标签: java timer

因此,在我的java类中,我们有一个作业分配使用System.currentTimeMillis来显示点击之间的时间量。我尝试过但尝试过但是没有用。这是我的代码。

 1 /* Matthew Caldwell
 2  * September 21, 2011
 3  * Homework #4: Problem 5.8.1 pg. 149
 4  * Program that displays the amount of time that passed
 5  * between two mouse clicks. Nothing is displayed
 6  * on the first click, then each successive click will 
 7  * display how much time passed between that click and 
 8  * the previous one. 
 9  */  
10  
11 import objectdraw.*; 
12 import java.awt.*; 
13  
14 public class ElapsedTimeClient extends WindowController { 
15    
16   public static void main(String[]args) { 
17     new ElapsedTimeClient().startController(800,500);
18   }
19 
20   private Text title,result;
21   private double count = 0;
22 
23   public void begin() {
24     
25     // Set up the title and result
26     title = new Text("CLICK COUNTER",
27                      canvas.getWidth() / 2,
28                      20, canvas);29     title.move(-title.getWidth() / 2, 0);
30     result = new Text("", canvas.getWidth() / 2, 40, canvas);
31 
32   }
33 
34   public void onMouseClick(Location p) {
35 
36     double timerS=0;
37 
38     if(count == 0) {
39       timerS = System.currentTimeMillis();
40     } else {
41       result.setText("The time between clicks was " +
42                      (System.currentTimeMillis() - timerS)/1000 +
43                      " seconds.");
44       timerS = System.currentTimeMillis();
45     }
46 
47     count++;
48 
49   } 
50  
51 }

我真的不想让任何人完全告诉我该怎么做但我只需要一点指导。我做错了什么? 代码全部编译并运行得很好,但是当我点击而不是给我点击之间经过的时间时,它给了我一个永远不会改变的大数字。它几乎每次都告诉我1.316639174817E9。

5 个答案:

答案 0 :(得分:4)

首先,以毫秒为单位的系统时间应表示为长,而不是双倍。

其次,你需要创建一个变量,它保存自上次点击(timerS)以来的实际变量时间,它当前是本地方法,因此每次都重置。

简而言之,改变:

double timerS=0;

从局部变量,实例变量和long:

public class ElapsedTimeClient extends WindowController { 
long timerS;

答案 1 :(得分:2)

timerS变量在onMouseClick方法的内声明,因此只存在于此方法中。第一次单击鼠标后,该变量消失,无法用于比较时间。

相反,您应该使用类变量来存储此信息。

答案 2 :(得分:1)

你的问题是:

  • timerS应该是该类的字段(不是局部变量),否则在您的方法调用之间不会保留其值
  • timerS应为long类型 - 从系统时间返回的类型

此外:

  • count应为int

答案 3 :(得分:1)

除了提到的其他答案外,System.nanoTime是此类测量的首选方法。该方法测量的是纳秒数,而不是测量“时钟时间”的差异。您经常会发现currentTimeMilils上的分辨率并不比16 ms左右更好,而nanoTime可以解决更小的间隔。

答案 4 :(得分:0)

timerS不需要双重类型。 currentTimeMillis()返回long。

为什么会这样? 如果您使用这样的双重类型:

(double - long) / 1000, 

解释如下:

double / double = double 

所以在结果中你有“精确”值(例如1.316639174817E9)而不是长值。