Java 如何安排不受计算机挂起影响的定时事件
我想将事件安排在特定的时间发生,而不管计算机是否同时挂起。如果在事件发生时计算机被挂起,我希望在恢复时立即安排它 我尝试了两种方法:一种是带有sleep()的线程,另一种是Swing计时器。这两种方法都依赖于定时延迟,并且都存在相同的问题,即延迟倒计时在计算机挂起时暂停,并且仅在计算机恢复时继续,因此事件发生在(原始延迟+暂停时间) 然后我猜我应该做的是使用(util)计时器和目标日期,因为它指定了一个时间点,如下所示:Java 如何安排不受计算机挂起影响的定时事件,java,timer,delayed-execution,Java,Timer,Delayed Execution,我想将事件安排在特定的时间发生,而不管计算机是否同时挂起。如果在事件发生时计算机被挂起,我希望在恢复时立即安排它 我尝试了两种方法:一种是带有sleep()的线程,另一种是Swing计时器。这两种方法都依赖于定时延迟,并且都存在相同的问题,即延迟倒计时在计算机挂起时暂停,并且仅在计算机恢复时继续,因此事件发生在(原始延迟+暂停时间) 然后我猜我应该做的是使用(util)计时器和目标日期,因为它指定了一个时间点,如下所示: Date targetDate = new Date(System.cur
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通常是一个很好的建议,但我试过了,正如我怀疑的那样,遇到了同样的问题。我也遇到了类似的解决方案,但我希望一些定时器选项能让它按我预期的方式工作。如果没有其他建议,这就是我要做的。谢谢顺便说一句,“延迟倒计时暂停”确实是发生了什么,通过检查。这并不意味着维护“系统时间”——我想这两种方法有相当独立的实现。