如何在JavaSwing应用程序中安排任务?

如何在JavaSwing应用程序中安排任务?,java,swing,time,scheduled-tasks,quartz-scheduler,Java,Swing,Time,Scheduled Tasks,Quartz Scheduler,我有一个要求,我需要采取我的一些文件的副本,并把它放在内部服务器。这需要定期发生,比如每天晚上8点。这也是一个Swing应用程序,在我的本地PC上运行。我知道我可以使用Java计划任务,可以使用Java.util.Time,JodaTime,或者更好的Quartz调度器 但是,问题来了。没有人会仅仅为了这个调度器就让计算机开机24小时。据我所知,如果有人重启电脑,Java调度器也会死掉。相反,一旦任务计划完成,如果计算机已打开,则计划的任务应在每天晚上8点进行,无需人工交互。这意味着,无需重新启

我有一个要求,我需要采取我的一些文件的副本,并把它放在内部服务器。这需要定期发生,比如每天晚上8点。这也是一个Swing应用程序,在我的本地PC上运行。我知道我可以使用Java计划任务,可以使用
Java.util.Time
JodaTime
,或者更好的
Quartz调度器

但是,问题来了。没有人会仅仅为了这个调度器就让计算机开机24小时。据我所知,如果有人重启电脑,Java调度器也会死掉。相反,一旦任务计划完成,如果计算机已打开,则计划的任务应在每天晚上8点进行,无需人工交互。这意味着,无需重新启动应用程序并重新安排时间

我描述的这个特性非常常见,可以在所有的病毒防护、基于windows的警报等中看到。但是如何在Java中实现同样的功能呢?目前,如果我必须使用windows特定的解决方案,如使用
JNI
或批处理文件等(我使用的是windows),也可以


至少这在java中是可能的?

为了在重新启动后安排并保持应用程序的计划(在java中),需要重新启动java应用程序并再次安排


让应用程序在启动时运行:然后重新调度。

为了在重启后安排并保持应用程序的调度(Java),需要让Java应用程序重新启动并再次调度

让应用程序在启动时运行:然后重新计划。

正确无误。下面是有关重新启动Java应用程序后设置时间表的编码的详细信息

ScheduledExecutorService
如果使用该界面计划定期任务,其中一个参数是
initialDelay
。您可以指定等待到任务首次出现的时间量。在一次延迟之后,您的任务将在另一个参数
period
指定的每一段时间后重新执行

因此,每次重新启动后,将当前时刻与第一次运行所需的时刻进行比较。中间的时间跨度是指定为
initialDelay
参数的量

首先获取当前时刻

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
在同一天设定你想要的时间(目标)

LocalTime target = LocalTime.of( 20 , 0 );
ZonedDateTime then = ZonedDateTime.of( now.toLocalDate() , target , z );
看看今天的时间是否已经过去了。如果已经过去,请添加一天,直到第二天

if ( ! then.isAfter( now ) ) {  // If already past our target of 8 PM today, move to tomorrow.
    then = then.plusDays( 1 );
}
计算从现在到将来我们要运行任务第一次发生的时刻之间的时间跨度()

Duration initialDelay = Duration.between( now ; then );
指定作为
持续时间
对象运行此任务的频率(
period

Duration period = Duration.ofHours( 24 );
将我们的一对
Duration
对象转换为分钟数、秒数、毫秒数或您想要的任何粒度。请记住,你的任务并不是在你想要的那一刻完成的。您的任务可能会因线程执行的调度或任务的下一次运行正在等待上一次运行完成等原因而延迟。因此,我怀疑,对于一项日常任务来说,分钟甚至是足够精细的粒度

myScheduledExecutorService.scheduleAtFixedRate( 
    myRunnable , 
    initialDelay.getSeconds() , 
    period.getSeconds() , 
    TimeUnit.SECONDS 
) ; 
重述:

  • initialDelay
    是应用程序重新启动后用来安排首次运行任务的时间跨度
  • period
    是重复运行任务所用的时间跨度
正确无误。下面是有关重新启动Java应用程序后设置时间表的编码的详细信息

ScheduledExecutorService
如果使用该界面计划定期任务,其中一个参数是
initialDelay
。您可以指定等待到任务首次出现的时间量。在一次延迟之后,您的任务将在另一个参数
period
指定的每一段时间后重新执行

因此,每次重新启动后,将当前时刻与第一次运行所需的时刻进行比较。中间的时间跨度是指定为
initialDelay
参数的量

首先获取当前时刻

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
在同一天设定你想要的时间(目标)

LocalTime target = LocalTime.of( 20 , 0 );
ZonedDateTime then = ZonedDateTime.of( now.toLocalDate() , target , z );
看看今天的时间是否已经过去了。如果已经过去,请添加一天,直到第二天

if ( ! then.isAfter( now ) ) {  // If already past our target of 8 PM today, move to tomorrow.
    then = then.plusDays( 1 );
}
计算从现在到将来我们要运行任务第一次发生的时刻之间的时间跨度()

Duration initialDelay = Duration.between( now ; then );
指定作为
持续时间
对象运行此任务的频率(
period

Duration period = Duration.ofHours( 24 );
将我们的一对
Duration
对象转换为分钟数、秒数、毫秒数或您想要的任何粒度。请记住,你的任务并不是在你想要的那一刻完成的。您的任务可能会因线程执行的调度或任务的下一次运行正在等待上一次运行完成等原因而延迟。因此,我怀疑,对于一项日常任务来说,分钟甚至是足够精细的粒度

myScheduledExecutorService.scheduleAtFixedRate( 
    myRunnable , 
    initialDelay.getSeconds() , 
    period.getSeconds() , 
    TimeUnit.SECONDS 
) ; 
重述:

  • initialDelay
    是应用程序重新启动后用来安排首次运行任务的时间跨度
  • period
    是重复运行任务所用的时间跨度

为什么不让应用程序在启动时运行?@ThomasNairn:Quartz调度器在机器关闭时死亡。我不知道GUI是如何实现的,但我在web服务器上看到过这种情况。但是如果应用程序是在后台运行的。(setVisible(false);)您可以使用一个简单的线程重新安排时间,甚至只是监视时间?如果计算机在给定的时间内仍处于关机状态怎么办?无论哪种方式,您都需要一个操作系统级的工具(或者相当于,可以持久化任务并在启动时启动的工具),例如
cron
。@biziclop:如果计算机关闭了,没关系。没有副本,为什么不麦