Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何安排不受计算机挂起影响的定时事件_Java_Timer_Delayed Execution - Fatal编程技术网

Java 如何安排不受计算机挂起影响的定时事件

Java 如何安排不受计算机挂起影响的定时事件,java,timer,delayed-execution,Java,Timer,Delayed Execution,我想将事件安排在特定的时间发生,而不管计算机是否同时挂起。如果在事件发生时计算机被挂起,我希望在恢复时立即安排它 我尝试了两种方法:一种是带有sleep()的线程,另一种是Swing计时器。这两种方法都依赖于定时延迟,并且都存在相同的问题,即延迟倒计时在计算机挂起时暂停,并且仅在计算机恢复时继续,因此事件发生在(原始延迟+暂停时间) 然后我猜我应该做的是使用(util)计时器和目标日期,因为它指定了一个时间点,如下所示: Date targetDate = new Date(System.cur

我想将事件安排在特定的时间发生,而不管计算机是否同时挂起。如果在事件发生时计算机被挂起,我希望在恢复时立即安排它

我尝试了两种方法:一种是带有sleep()的线程,另一种是Swing计时器。这两种方法都依赖于定时延迟,并且都存在相同的问题,即延迟倒计时在计算机挂起时暂停,并且仅在计算机恢复时继续,因此事件发生在(原始延迟+暂停时间)

然后我猜我应该做的是使用(util)计时器和目标日期,因为它指定了一个时间点,如下所示:

Date targetDate = new Date(System.currentTimeMillis() + (60 * 1000)); // in 1 min
Timer eventTimer = new Timer();
eventTimer.schedule(eventThread, targetDate);
不幸的是,这种情况也会受到同样的影响

我也查看了ScheduledExecutorService(虽然我认为这个应用程序的杀伤力过高),但它显式地使用了延迟,所以我认为它也会遇到同样的问题

我想做的事可能吗

延迟倒计时暂停

不,事实并非如此。否则,这将意味着系统的时间将是错误的恢复

我想做的事可能吗

以下是一个解决方案:

  • 让一个任务处理所有调度,比如说,每秒钟运行一次
  • 在要执行的任务中,记录时间,使任务的类别与预期执行时间相比较
  • 将所有这些任务放入PriorityQueue(甚至PriorityBlockingQueue)
  • 当调度任务唤醒时,查看任务;如果预期执行时间小于或等于当前时间,则将其出列并执行;重复此操作,直到查看的任务的预期执行时间大于当前时间

这不利于“恢复后立即执行”,但接近于。

事情甚至更奇怪。我有一个程序,使用java.util.Timer和合适的TimerTask每小时刷新一次数据。在openSuse达到13.1版时,该程序按要求工作-当由于暂停而导致实时超过周期时,在恢复后立即调用该任务。 使用相同的jvm(1.8.0_40-b10)和相同的Linux内核(3.14.24)运行相同的程序,但使用openSuse 13.2时,任务不会在恢复时调用,而是在唤醒模式下的周期过期后才调用。
我通过在当前时间超过计划时间时通过功能键调用任务,并在必要时重新同步任务,解决了这个问题。这是一个麻烦,但可以接受,因为简历无论如何都是通过按键完成的。

正如您在这里看到的,建议使用执行器而不是计时器(使用它们也很简单)@ovdsm通常是一个很好的建议,但我试过了,正如我怀疑的那样,遇到了同样的问题。我也遇到了类似的解决方案,但我希望一些定时器选项能让它按我预期的方式工作。如果没有其他建议,这就是我要做的。谢谢顺便说一句,“延迟倒计时暂停”确实是发生了什么,通过检查。这并不意味着维护“系统时间”——我想这两种方法有相当独立的实现。