我的应用程序中有一个 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/