ScheduledExecutorService任务的阻塞时间超过其运行间隔

时间:2019-02-12 15:54:27

标签: java multithreading locking threadpoolexecutor starvation

关于ScheduledExecutorService.shceduleAtFixedRate的问题-我安排taskA每500毫秒运行一次,这会阻塞1000毫秒。现在,随后的处决不再等待额外的500毫秒,而是在前一个之后立即开始。

taskA获取一个内部锁,该锁也由另一个线程获取(尝试)。由于内在锁没有公平性,无法保证此线程有饥饿的危险,所以这是我的问题:是否有好的/干净的方法来避免这种危险?例如。安排任务每1500毫秒运行一次(听起来不是很防水)吗?还是我们期望锁获得一种“摊销的公平性”?

1 个答案:

答案 0 :(得分:2)

是的,您可以使用enter image description here

  

创建并执行一个周期性操作,该操作将在给定的初始延迟后首先启用,然后以给定的延迟在一次执行的终止与下一次执行的开始之间启用。如果该任务的任何执行遇到异常,则将禁止后续执行。否则,任务将仅通过取消或终止执行程序而终止。

因此,您给出的延迟是下一个倒数第二个结束点之间的时间-即运行之间没有重叠。