用Java计算经过的时间



javax.swing.Timer timer;是否足以计算所用时间?我正在做一个俄罗斯方块项目,该项目还计算玩家玩游戏所需的时间。在play方法中,

public void play() {
reset();
onPlay = true;
Thread thread = new Thread(new Game());
thread.start();
rightPanel.setPlayButtonEnable(false);
rightPanel.setPause(true);
rightPanel.setStop(true);
playItem.setEnabled(false);
pauseItem.setEnabled(true);
stopItem.setEnabled(true);
setBlockColorItem.setEnabled(false);
setBGColorItem.setEnabled(false);
rightPanel.requestFocus();
//time.start();
//timeElapsed = System.currentTimeMillis();
RightPanel.timeElapsedTextField.setText("");
timer.start();
startTime = System.currentTimeMillis();
}


stop方法中,

public void stop() {
isStop=true;
onPlay = false;
if (piece != null) 
piece.isMoving = false;
playItem.setEnabled(true);  
rightPanel.setPlayButtonEnable(true);
pauseItem.setEnabled(false); 
rightPanel.setPauseButtonLabel(true);
stopItem.setEnabled(false);   
resumeItem.setEnabled(false);
setBlockColorItem.setEnabled(true);
setBGColorItem.setEnabled(true);
rightPanel.setPause(false);
rightPanel.setStop(false);
reset();
//time.stop();
timer.stop();
long delta = (System.currentTimeMillis() - startTime)/10;
RightPanel.timeElapsedTextField.setText(Double.toString(delta/100.0) + " seconds");
}



这些够了吗?每当试图显示经过的时间时,JTextField都不显示任何内容。可能出了什么问题?非常感谢!

public void run() {
int column = 4, style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
//timer.start();
//startTime = System.currentTimeMillis();
while (onPlay) {
if (piece != null) {
if (piece.isAlive()) {
try {
Thread.currentThread().sleep(100);
} 
catch (InterruptedException ie) {
ie.printStackTrace();
}
continue;
}
}
checkFullLine();  
if (isGameOver()) {
playItem.setEnabled(true);
pauseItem.setEnabled(true);
resumeItem.setEnabled(false);
rightPanel.setPlayButtonEnable(true);
rightPanel.setPauseButtonLabel(true);
displayGameOver();
return;
}
piece = new Piece(style, -1, column, board);
piece.start();
//numDropped = numDropped+1;
//RightPanel.scoreTextField.setText(numDropped+"");
style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
rightPanel.setTipStyle(style);
numDropped = numDropped+1;
RightPanel.numDroppedTextField.setText(numDropped+"");
//RightPanel.numDroppedTextField = new JTextField(numDropped+"");
long startTime = System.currentTimeMillis();
}
long estimatedTime = ((System.currentTimeMillis() - startTime)/1000);
RightPanel.timeElapsedTextField.setText(estimatedTime+"");
}

您应该使用nanoTime()来计算经过的时间。

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;

你有一个线程正在为Game运行。我认为您应该在start of run()方法和estimatedTime end of run(()方法中计算startTime。我只能推测,因为我不知道游戏类代码。

下面是如何做到这一点的简单说明。

import java.util.concurrent.TimeUnit;
public class Demo implements Runnable {
private volatile boolean shouldRun = true;
@Override
public void run() {
long startTime = System.nanoTime();
while (shouldRun) {
// do nothing
}
long estimatedTime = System.nanoTime() - startTime;
System.out.println(TimeUnit.NANOSECONDS.toSeconds(estimatedTime));//Print apprx 5 seconds since time may be required to actually enter in to run method after start
}
public void stop() {
shouldRun = false;
}
public static void main(String[] args) throws InterruptedException {
Demo demo = new Demo();
Thread thread = new Thread(demo);
thread.start();
Thread.sleep(5000);// 5 Seconds sleep
demo.stop();// Stop the thread
}
}

tl;dr

Duration
.between(
then , 
Instant.now()
)
.toSeconds()

详细信息

Timer不测量经过的时间。

您对System.currentTimeMillis的调用可测量所用时间。但是这种方法在Java8及更高版本中已经过时了。相反,请使用java.time.Instant

Instant表示UTC中的一个时刻,分辨率为纳秒。然而,当前传统计算机中的硬件时钟并不能准确地跟踪时间,因此Instant.now在Java 9及更高版本中以微秒的分辨率捕捉当前时刻(仅在Java 8中为毫秒)。

Instant start = Instant.now() ; 
…
Instant stop = Instant.now() ;

要表示这两个时刻之间经过的时间,请使用Duration

Duration d = Duration.between( start , stop ) ;

在标准ISO 8601中为经过的时间生成文本。

String output = d.toString() ;

或者询问几秒钟或诸如此类的时间。

long secondsElapsed = d.toSeconds() ;

关于java.time

java.time框架构建在Java8及更高版本中。这些类取代了诸如java.util.DateCalendar和&SimpleDateFormat

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

现在处于维护模式的JodaTime项目建议迁移到java.Time类。

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,也不需要java.sql.*类。

从哪里获得java.time类?

  • Java SE 8Java SE 9Java SE 10爪哇SE 11及更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大多数Java.time功能都是向后移植到Java 6&7英寸ThreeTen背包
  • Android
    • java.time类的Android捆绑包的后续版本
    • 对于早期的Android(<26),ThreeTenABP项目适用于ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

最新更新