【问题标题】:How to use the current time in a Java Program?如何在 Java 程序中使用当前时间?
【发布时间】:2014-11-16 16:46:30
【问题描述】:

比如说,我要运行下面的程序

double x = 15.6
System.out.println(x);

但我想重复这个程序,直到某个时间过去,例如:

do{
double x = 15.6
System.out.println(x);
}while (current time is earlier than 12.00pm)

即使该示例完全是假设性的,但我将如何在 while 循环中执行该操作,以使程序一直反复运行直到某个时间,例如 3pm9.30pm

如果这是不可能的,有什么方法可以模拟这个,每隔这么多秒运行一次程序,直到达到那个时间?

【问题讨论】:

  • 请记住,这样的代码会非常浪费资源。在 while 循环中使用 Thread.Sleep ,或者如果这是您想要完成的,甚至更好地查看计时器类。 docs.oracle.com/javase/7/docs/api/java/util/Timer.htmlstackoverflow.com/questions/4044726/how-to-set-a-timer-in-java
  • Even though the example is completely hypothetical 是这里的主要问题。你无法用现实生活中的工具解决想象中的问题。请提供更详细的描述您试图通过不断运行代码来实现的目标 - 您提供的示例将导致 100% 的 CPU 负载和不稳定的代码执行,例如达到最大 Java/OS 控制台吞吐量等,同时没有做任何有意义的工作。

标签: java time timer scheduling job-scheduling


【解决方案1】:

a) 在某个时间到来之前,您通常不需要代码真正运行 - 您无法控制代码以这种方式执行的次数。常规代码有时必须休眠,以控制操作系统和其他进程,以免它们在 100% 的 CPU 负载下阻塞系统。因此,实际上运行代码对于 99% 的与时间相关的可能问题是错误的方法。请描述您希望使用此代码解决的确切问题。

b) 对于这 99% 的问题,请使用 Timer 实例。就那么简单。 https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html - 安排任务运行,例如每秒 1000 次,并检查每个事件的时间,当超过时间阈值时终止 Timer 实例。

例如,上面的代码将让您连续执行Do something 部分,每 1 秒一次,直到 16.11.2014 20:00 GMT。通过更改delayMs,您可以轻松实现更高/更低的时间粒度。如果您希望您的代码运行频率超过 1000/秒,那么无论如何您都应该使用 JNI,因为已知 Java 计时器/时钟在某些(较旧的)平台上具有 How can I measure time with microsecond precision in Java? 等。

    Timer timer = new Timer();
    int delayMs = 1000; // check time every one second
    long timeToStop;
    try {
        timeToStop = new SimpleDateFormat( "DD.MM.YYYY HH:mm" ).parse( "16.11.2014 20:00" ).getTime(); // GMT time, needs to be offset by TZ
    } catch (ParseException ex) {
        throw new RuntimeException( ex );
    }
    timer.scheduleAtFixedRate( new TimerTask() {
        @Override
        public void run() {
            if ( System.currentTimeMillis() < timeToStop ) {
                System.out.println( "Do something every " + delayMs + " milliseconds" );
            } else {
                timer.cancel();
            }
        }

    }, 0, delayMs );

or 你可以使用例如ExecutorService service = Executors.newSingleThreadExecutor(); 等 - 但是如果不明确知道问题是什么,几乎不可能给你一个好的方法来解决你的问题。

【讨论】:

  • 很简单,我有一个程序,我想在按下“运行”时开始运行,并一直运行到下午 4.30。您还需要什么其他信息?
  • 程序的功能是什么 - 你想通过运行它来实现什么。您可能正在尝试为您的任务使用错误的工具。默认情况下,只要您不从main() 方法返回,应用程序就会运行;通过例如创建一个 JFrame,您可以根据需要让应用程序保持打开状态。此外,您想要达到的时间粒度是多少,即您希望多久检查一次预期时间是否已过? 1 秒够吗?
【解决方案2】:

类似的东西

//get a Date object for the time to stop, then get milliseconds
long timeToStop = new SimpleDateFormat("DD:MM:HH:mm").parse("16:11:12:00").getTime();

//get milliseconds now, and compare to milliseconds from before
do {
//do stuff
} while(System.currentTimeMillis() < timeToStop)

【讨论】:

  • 我需要这个程序运行一整天。是否有可能在所有程序之外有一个 while 循环,使其运行到无穷大,直到有人终止它?
  • 如果“修复”你的意思是恢复到原来的错误版本——是的,我同意,你肯定已经“修复”了它。可惜你没有理解我评论背后的理由。
  • @vaxquis 已还原为原始状态,并将 Date 替换为 System.currentTimeMillis 这不是您想要的吗?
  • new SimpleDateFormat("HH:mm").parse("12:00") 出现红色下划线
  • 导入 java.text.SimpleDateFormat; public class testing { public static void main (String[] args){ //获取停止时间的Date对象,然后获取毫秒长 timeToStop = new SimpleDateFormat("HH:mm").parse("12:00" ).getTime(); // 现在获取毫秒,并与之前的毫秒进行比较 do{ //do stuff } while(System.currentTimeMillis()
猜你喜欢
  • 2019-07-21
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多