Programming/Java

[Java]스톱워치를 구현하는 방법

MB Brad KWON 2012. 11. 14. 19:29

 스톱워치를 구현함에 있어서 스레드의 sleep함수를 이용해서 시간을 카운트하도록 설계를 했었다. 하지만 이와 같은 방법을 쓰게될 경우, 스레드틑 CPU로부터 할당 받은 시간만큼만 실행되게 됨으로 정밀하게 유효한 값을 가지기가 힘들다. 그러면 CPU로부터 유효한 시간을 유지하면서 시간을 재는 초시계를 구현하려면 어떻게 해야하는가....??

 생각외로 답은 간단했다. 답은 시스템 시간에 있었다. 스레드를 이용하여 이정 시간단위로 시스템 시간을 가져온다. 시간을 재기 시작한 시스템시간을 기록해 놨다가 스레드가 매번 시스템 시간을 가져와 그 차이로 스톱워치의 시간을 갱신하는 방법이다. CPU할당시간이 밀리더라도 시스템 시간을 가져와 갱신하기 때문에 스레드 sleep함수를 이용하여 시간을 갱신하는 것보다 더 정밀한 시간을 잴 수가 있다.


==소스는 차후, 등록 예정==


import java.io.*;


public class Example {
  static String timerBuffer; // 04:11:15 등의 경과 시간 문자열이 저장될 버퍼 정의
  static int oldTime; // 타이머가 ON 되었을 때의 시각을 기억하고 있는 변수

  public static void main(String[] args) {

    stopwatch(1); // 1을 인수로 넣으면 타이머가 켜짐
    System.out.println("Timer ON! 엔터 키를 누르면 종료합니다");

    pause(); // 유저가 Enter키를 누를 때까지 무한정 대기

    stopwatch(0); // 0을 넣으면 타이머가 꺼지고 시간 문자열을 버퍼에 설정
    System.out.format("Timer OFF! 경과 시간: [%s]%n", timerBuffer); // 경과 시간 화면에 출력
  }


  public static void stopwatch(int onOff) {
    if (onOff == 1) // 타이머 켜기
      oldTime = (int) System.currentTimeMillis() / 1000;

    if (onOff == 0) // 타이머 끄고, 시분초를 timerBuffer 에 저장
      secToHHMMSS(  ((int) System.currentTimeMillis() / 1000) - oldTime  );

  }


  // 정수로 된 시간을 초단위(sec)로 입력 받아, "04:11:15" 등의 형식의 문자열로 시분초를 저장
  public static void secToHHMMSS(int secs) {
    int hour, min, sec;

    sec  = secs % 60;
    min  = secs / 60 % 60;
    hour = secs / 3600;

    timerBuffer = String.format("%02d:%02d:%02d", hour, min, sec);
  }


  public static void pause() {
    try {
      System.in.read();
    } catch (IOException e) { }
  }


}