java - Java中计算耗时

标签 java timer

javax.swing.Timer timer;足够计算耗时吗?我正在做一个俄罗斯方 block 项目,它还计算玩家玩游戏所花费的时间。在 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;

您有一个正在运行游戏的线程。我认为你应该在 run() 方法的开始和 run() 方法的估计时间结束中计算 startTime 。我只能推测,因为我不知道 Game 类代码。

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

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

关于java - Java中计算耗时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823883/

相关文章:

java - 如何使用java 7在控制台上显示刻度线?

java - 如何让这个 java for 循环在每次迭代之间暂停 1/2 秒?

java Timer TimerTask多线程

ios - Swift:动态调整大小标签的宽度约束

java - 这会使 StringBuilder 的使用变得多余吗?

java - GC(垃圾收集器)如何标记一个对象进行垃圾收集?

java - 如何区分指定的数据库不存在或者用户没有访问数据库的权限?

Java 8 并行流缩减——线程数与加速比

java - 每周运行一次计时器

c# - 在 C# 中应用程序结束之前计时器不会触发