我有一个要求,我需要采取我的一些文件的副本,并把它放在内部服务器。这需要定期发生,比如每天晚上8点。这也是一个Swing应用程序,在我的本地PC上运行。我知道我可以使用Java计划任务,或者使用Java。util。时间
,JodaTime
或者更好的Quartz调度器
。
但是,问题来了。没有人会仅仅为了这个调度器就让计算机开机24小时。据我所知,如果有人重启电脑,Java调度器也会死掉。相反,一旦任务计划完成,如果计算机已打开,则计划的任务应在每天晚上8点进行,无需人工交互。这意味着,无需重新启动应用程序并重新安排时间。
我描述的这个特性非常常见,可以在所有的病毒防护、基于windows的警报等中看到。但是如何在Java中实现同样的功能呢?目前,如果我必须使用windows特定的解决方案,如使用JNI
或批处理文件等(我使用的是windows),也可以。
至少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
),此时我们要运行任务的第一次发生。
Duration initialDelay = Duration.between( now ; then );
指定作为持续时间
对象运行此任务的频率(period
)。
Duration period = Duration.ofHours( 24 );
将我们的一对Duration
对象转换为几分钟、几秒钟或毫秒或任何您想要的粒度。请记住,你的任务不是在你想要的精确瞬间完成的。您的任务可能会因线程执行的调度或任务的下一次运行正在等待上一次运行完成等原因而延迟。所以我怀疑TimeUnit。SECONDS
甚至分钟对于日常任务来说是一个足够精细的粒度。
myScheduledExecutorService.scheduleAtFixedRate(
myRunnable ,
initialDelay.getSeconds() ,
period.getSeconds() ,
TimeUnit.SECONDS
) ;
回顾一下:
初始延迟
是应用程序重启后用于安排任务第一次运行的时间跨度。周期
是用于重复运行任务的时间跨度。为了调度并保持应用程序的调度(Java),在重新启动后,Java应用程序重新启动并再次调度。
启动时运行应用程序:在Windows启动时运行Java应用程序,然后重新调度。
当我尝试运行一个新的Swing应用程序时,我遇到了一些重大问题。我使用的是NetBeans 8.1、JDK版本1.8和OS Windows 10。 所以每次我试图打开一个新的Swing项目(不管它是应用项目还是EA),并且我运行它,NetBeans都会正确部署它,但是Swing窗口没有打开,在NetBeans的状态栏中它只是显示正在运行。我等了几分钟,然后我不得不停止构建,因为什么都没发生。当我在
我在Tomcat中部署了一个web应用程序。我有一套代码,它检查数据库中的某些数据,然后根据这些数据向用户发送邮件。有人能建议如何在Tomcat中安排这项工作吗。
问题内容: 我需要安排任务以固定的时间间隔运行。如何在长间隔(例如每8个小时)的支持下执行此操作? 我目前正在使用。是否支持长时间间隔? 问题答案: 使用:
在Android 9中 我还在清单文件中添加了必需的权限。 当我运行这个程序时,它告诉我解析包错误时出现了问题。
我发现用Swing编写好的OO代码非常困难。我的问题本质上是我有一个带有动作侦听器的视图(J面板)。动作侦听器找出单击了哪个按钮,并调用适当的控制器方法。问题是这个控制器方法需要更新另一个视图。所以我遇到的问题是我有视图被到处传递给控制器。这里有一个例子。 这本质上是我想要的,但这是最终发生的事情。 您可以看到,随着需要更新的视图数量的增加以及类似于此的类数量的增加,视图本质上是全局变量,代码变得
问题内容: 我正在使用类,并且正在使用其schedule方法执行某些任务,但是在执行了6次之后,我必须停止其任务。 我该怎么办? 问题答案: 在某个地方保留对计时器的引用,并使用: 停止所做的一切。您可以将此代码放在要执行的任务中,static int以计算您经过的次数,例如