使用睡眠线程暂停秒表计时器?

时间:2014-07-29 22:07:59

标签: java thread-sleep

我试图用Java制作秒表,并且不知道如何暂停和继续我的计时器。这是我到目前为止所做的。

startButton.addActionListener(this);
stopButton.addActionListener(this);
pauseButton.addActionListener(this);

public void actionPerformed(ActionEvent e) {
    Calendar aCalendar = Calendar.getInstance();
    if (e.getSource() == startButton){
        start = aCalendar.getTimeInMillis();
        startButton.setBackground(Color.GREEN);
        stopButton.setBackground(null);
        pauseButton.setBackground(null);
    } else if (e.getSource() == stopButton) {
        stopButton.setBackground(Color.RED);
        startButton.setBackground(null);
        pauseButton.setBackground(null);
        aJLabel.setText("Elapsed time is: " + 
                (double) (aCalendar.getTimeInMillis() - start) / 1000 );
    } else if (e.getSource() == pauseButton) {
        pauseButton.setBackground(Color.YELLOW);
        stopButton.setBackground(null);
        startButton.setBackground(null);
    }
}

如您所见,我只更改了暂停按钮的颜色。我不知道如何通过让用户点击按钮来暂停线程。我发现thread.sleep()的所有例子都有特定的时间。

1 个答案:

答案 0 :(得分:0)

你可以像这样使用swing.Timer(不是util.Timer):

int interval = 100; // set milliseconds for each loop
Timer timer = new Timer(interval, (evt) -> repeatingProccess());
// create the method  repeatingProccess() with your
// code that makes the clock tick


startButton.addActionListener(e -> timer.start());
stopButton.addActionListener( e -> {
    timer.stop(); 
    // here refresh your clock with some code... 
};
pauseButton.addActionListener(e -> timer.stop());

你编写了一个名为repeatingProccess()的方法,它每隔interval毫秒就会一次又一次地在自己的线程中工作。对于计算秒数的时钟,您可以执行此操作:

int interval = 1000;
int seconds = 0;
public void repeatingProccess() {
    seconds++ ;
}

请注意:    第二个不是正好1000毫秒但是大约1001,因为运行seconds++所需的时间,但您也可以通过获取前后的系统时间并减去时钟的差异来解决这个问题。您应该使用Calendar API。