0

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

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

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

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

4

1 回答 1

1

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

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

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

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

于 2019-11-27T04:48:30.500 回答