1

我正在制作一个小型闹钟应用程序来复习 Java。该应用程序的目的是让用户设置时钟时间和闹钟时间,然后当系统时间等于闹钟时间时闹钟应该“响起”。

时钟类包含日历和日期对象。

时钟是从类外的主要方法中引用的。在那个主要方法中,我构建了一个简单的命令行用户界面,用户可以在其中设置时钟和闹钟的时间。默认情况下,时钟初始化为当前系统时间。

然而,问题在于自动初始化和用户定义的时钟对象——它们不是“滴答”或更新。

Clock regularClock = new Clock(); //Defaults clock (using a Date) to the system time

while (userInput != "Quit")
{
   switch(userInput)
   {
      ...Other choices here...
      case "Set Time":  System.out.print("Enter hour: ");
                    hours = kb.nextInt();
                System.out.print("\nEnter minutes: ");
                minutes = kb.nextInt();
                ACR.regularClock.setTime(hours, minutes);
                System.out.println("Clock has been set");

       case "Set Alarm": System.out.print("Enter hour: ");
            hours = kb.nextInt();
            System.out.print("\nEnter minutes: ");
            minutes = kb.nextInt();
            ACR.alarmClock.setTime(hours, minutes);
            ACR.alarmClock.setAlarmOn(true);
            System.out.println("Alarm has been set.");
            break;
      ...Other choices here...

  userInput = keyboard.next();
   }

正如您将看到的,没有循环或任何东西可以刷新或保持常规时钟滴答作响。出于某种原因,当我开始时,我认为 Date 和 Calendar 对象一旦创建就会继续运行——有点像秒表。

所以现在我想知道在这个while循环中更新它们的最佳方法是什么。如果只允许使用默认的系统时钟,那就很容易了——我每次都可以在 while 循环的开头创建一个新的 Date 对象。但是,如果他们选择了,那将覆盖用户创建的时钟时间。

此外,如果用户不输入任何输入 - 而只是让应用程序坐在那里 - 他/她将输入输入 - 它不应该仍然刷新时间并检查regularClock = alarmClock时间吗?我怎样才能做到这一点?

我意识到我现在有点漫不经心,所以我就这样吧。我一直在努力,但无法找出最佳解决方案。如果您有任何问题,请告诉我!

简短摘要问题:

  1. 如何保持 Date 或 Calendar 对象中的时间,即使它已被修改?

  2. 如何在等待用户输入的同时不断更新这些对象?

4

2 回答 2

3

有更简单的方法,但这不是问题;)

基本上,您需要建立某种可以在后台更新/修改时钟的“tick”线程......

您可以编写自己的Thread/Runnable来执行这些任务,但它们本质上是不准确的......

就像是...

Thread thread = new Thread(new Ticker());
thread.setDaemon(true); // Otherwise the JVM won't stop when you want it t
thread.start();

//...

public class Ticker implements Runnable {
    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException exp) {
            }
            // Update static reference to the clock...
        }
    }
}

不过要小心

使当前执行的线程休眠(暂时停止执行)指定的毫秒数,取决于系统计时器和调度程序的精度和准确性。该线程不会失去任何监视器的所有权。

另一种方法是使用java.util.Timer

Timer timer = new Timer(true);
timer.scheduleAtFixedRate(new Ticker(), 1000, 1000);

//...

public class Ticker extends TimerTask {
    public void run() {
        // Update static reference to the clock...
    }
}

再次,小心...

随后的执行大约每隔一段时间进行一次

于 2012-10-03T03:16:22.627 回答
2

日期和日历对象不会“运行”——它们代表特定的时间点。我相信您正在寻找的是Timer类。

于 2012-10-03T03:06:36.313 回答