如何在JavaSwing应用程序中安排任务?
我有一个要求,我需要采取我的一些文件的副本,并把它放在内部服务器。这需要定期发生,比如每天晚上8点。这也是一个Swing应用程序,在我的本地PC上运行。我知道我可以使用Java计划任务,可以使用如何在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点进行,无需人工交互。这意味着,无需重新启
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
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
cron
。@biziclop:如果计算机关闭了,没关系。没有副本,为什么不麦