为指定日期安排 Java 中的任务

Scheduling a task in Java for a specified date

我很期待学习 java。我制作了这个程序,当当前日期匹配指定日期时,它会执行一些代码,在这种情况下,它会退出 while 循环。 我想知道是否还有其他方法,但现在我会坚持使用此字符串比较。

出于某些原因,If 循环无法正常工作,我使用 System.out.println(date) 监视当前日期,但当它到达所需日期(按格式 HH:MM:SS)时,我会执行操作,字符串不相等并且 while 循环继续,有什么我想念的吗?

编辑:平台 = windows 7

public class Main {

static String DesiredDate;
static String date;
static boolean Programisrunning;

public static void main(String[] args) {

DesiredDate = "17:24:10";

 while(Programisrunning = true) {

     date = CurrentDate.GetDate();
     System.out.println(date);

     if(date.equals(DesiredDate)) {
         Programisrunning = false;
        }

    }

 System.out.println("Program succesfully terminated");

   }

}

//另一个class

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CurrentDate {

public static String GetDate(){
       DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

       Date date = new Date();
       return dateFormat.format(date);
     }

   }

执行者

While 循环解决方案不好,因为 CPU 很忙。使用 executors, specifically ScheduledExecutorService.

long delay = desiredDate.getTime() - System.currentTimeMillis();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(task, delay, TimeUnit.MILLISECONDS);

要安排任务,请使用 ScheduledExecutorService:

Date desiredDate = // ...
Date now = new Date();
long delay = desiredDate.getTime() - now.getTime();

ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.schedule(new Runnable(){
    @Override
    public void run() {
        Programisrunning = false;
        // + do other things?
    }
}, delay, TimeUnit.MILLISECONDS); // run in "delay" millis

为了计算,您应该将基于文本的日期 "hh:mm" 转换为长值,它表示 1.1.1970 (UTC) 的毫秒数。

这个值,例如由System.currentTimeMillis()传递;

SimpleDateFormat 将从给定的格式化人类可读时间 (yyyy hh:mm:ss) 传递日期,长值也可以通过 date.getTime();[=13 获取=]

在该背景下,在给定时间使用 class ScheduledExecutorService 到 运行 任务。

您可以只使用计时器 class 来计时:

/**
 * Runs a timer for the specified length.
 * @param milliseconds the amount of milliseconds to run for.
 * @param seconds the amount of seconds to run for.
 * @param minutes the amount of minutes to run for.
 * @param hours the amount of hours to run for.
 */
public void timerallfeatures(int milliseconds, int seconds, int minutes, int hours){
    int Timeinterval = (hours * 60 * 60 * 1000) + (minutes * 60 * 1000) + (seconds * 1000) + milliseconds;
    Timer timer = new Timer();
    timer.schedule(new TimerTask(){
        @Override
        public void run() {
            System.out.println("Your timer is up!");
            // Do stuff here
        }
    }, Timeinterval);
}

或重复计时器:

/**
 * Runs a timer for the specified length.
 * Timer repeats.
 * @param milliseconds the amount of milliseconds to run for.
 * @param seconds the amount of seconds to run for.
 * @param minutes the amount of minutes to run for.
 * @param hours the amount of hours to run for.
 */
public void timerallfeaturesrepeating(int milliseconds, int seconds, int minutes, int hours){
    int Timeinterval = hours * minutes * seconds * milliseconds;
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask(){
        @Override
        public void run() {
            System.out.println("Your timer is up!");
        }
    }, Timeinterval, Timeinterval);
}

Timer class 还有一个 schedule(TimerTask, Date) 方法来执行 Date 而不是时间长度(以毫秒为单位)

您还可以查看我编写的用于帮助 java io 和计时器函数的库,称为 "Shared Packages",它具有一系列计时器:https://github.com/JD9999/Shared-Packages/tree/master/Timers