我正在制作一个小闹钟应用程序来刷新Java。该应用程序的目的是让用户设置时钟时间和闹钟时间,然后当系统时间等于闹钟时间时,闹钟应该“熄灭”。
clock类包含Calendar和Date对象。
时钟是从类外的主方法引用的。在那个主要方法中,我构建了一个简单的命令行用户界面,用户可以在其中设置时钟和闹钟的时间。默认情况下,时钟初始化为当前系统时间。
但是,这里是自动初始化和用户定义的时钟对象的问题 - 它们不是“滴答”或更新。
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();
}
正如您将看到的,没有循环或任何东西可以刷新或保持regularClock滴答作响。出于某种原因,当我开始时,我认为Date和Calendar对象只是在创建后保持运行 - 有点像秒表。
所以现在我想知道在这个while循环中更新它们的最佳方法是什么。如果只允许使用默认的系统时钟,那将很容易 - 我每次都可以在while循环的开头创建一个新的Date对象。但是,如果他们选择了这个时间,那将覆盖用户创建的时钟时间。
此外,如果用户不输入任何输入 - 而只是让应用程序坐在那里 - 他/她将输入输入 - 不应该仍然刷新时间并检查regularClock = alarmClock时间?我怎么能这样做?
我意识到我现在正在散步,所以我会留下它。我一直在努力,但无法找到最佳解决方案。如果您有任何疑问,请告诉我们!
简短摘要问题:
如何在日期或日历对象中保留时间,即使已经修改过了?
如何在等待用户输入的同时不断更新这些对象?
答案 0 :(得分: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...
}
}
再次提防......
后续执行大致定期进行
答案 1 :(得分:2)
日期和日历对象不“运行” - 它们代表特定的时间点。 我相信你所寻找的是Timer类。