Java 定时器 ScheduleAtFixedRate。如何使调用 .cancel 仅在当前迭代完成后停止计时器

标签 java timer timertask reentrantreadwritelock

我的应用程序中有一个 ReentrantReadWriteLock。在timertask的run方法中,我写了锁,然后调用一个函数。之后我解锁:

timer.scheduleAtFixedRate(new TimerTask() {
                public void run() {
                    lock.writeLock().lock();
                    function();
                    lock.writeLock().unlock();
                }
        }, 0, 1000); // prints 1 every 1second

我担心的是如果这个计时器被取消并且锁无法解锁会发生什么。有没有办法让调用 .cancel 仅在当前迭代完成后停止计时器。

或者我可以使用另一种数据结构,它允许我在单独的线程上以一定的速率运行任务/函数,并能够停止它以便释放所有锁?

最佳答案

javadoc 告诉我们,调用 cancel() 不会中断当前正在运行的任务,因此这部分是安全的。

但是,如果可以的话,我建议您使用 ScheduledThreadPoolExecutor 而不是 Timer。 它功能更强大、使用更简单,并且对计划任务引发的潜在异常更具弹性。

使用 ScheduledThreadPoolExecutor,您可以通过在调度任务时返回的 Future 上调用 cancel(boolean mayInterruptIfRunning) 来取消特定任务,或者通过终止调度程序来取消所有已调度任务(请参阅 shutdown + waitTermination 方法) )。 如果您只需要一个线程来处理任务,您可以这样做。

我还强烈建议将锁获取和释放包含在 try...finally block 中。 这将确保每当任务内部发生问题时,锁总是会被正确释放。 否则,正如您所观察到的,任务中的问题将阻止锁被释放。

关于Java 定时器 ScheduleAtFixedRate。如何使调用 .cancel 仅在当前迭代完成后停止计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59062017/

相关文章:

java - 正确配置 Spring 的安全性 - Java

java - 如何在使用 rs.getString 时修复 'terminated'

java - 在哪里定义 JRE_HOME vaiable 系统变量或用户变量?

c - 使用 AVR 设置多个定时器

ios - Ntimer 实现

Java猜谜游戏循环错误

Java:它创建的定时器和线程

java - 当手机屏幕锁定时,Android 计时器会延迟

android - 我在哪里创建和使用 ScheduledThreadPoolExecutor、TimerTask 或 Handler?

java - 在 Java 中安排重复任务而不让它们因未经检查的异常而停止