Java 阻止时间超过其运行间隔的ScheduledExecutorService任务
关于Java 阻止时间超过其运行间隔的ScheduledExecutorService任务,java,multithreading,locking,threadpoolexecutor,starvation,Java,Multithreading,Locking,Threadpoolexecutor,Starvation,关于ScheduledExecutorService.shceduleAtFixedRate-I计划taskA每500毫秒运行一次,阻塞1000毫秒。现在,后续执行不会等待额外的500毫秒,而是在前一次执行之后立即开始 taskA获取一个内部锁,另一个线程也(尝试)获取该锁。因为内在锁没有公平性保证,所以这个线程有饥饿的风险,所以我的问题是:有没有好的/干净的方法来避免这种风险?例如,将任务计划为每1500毫秒运行一次(听起来不是很防水)?或者我们是否希望锁收购表现出一种“摊销公平”?是的,您可
ScheduledExecutorService.shceduleAtFixedRate
-I计划taskA
每500毫秒运行一次,阻塞1000毫秒。现在,后续执行不会等待额外的500毫秒,而是在前一次执行之后立即开始
taskA
获取一个内部锁,另一个线程也(尝试)获取该锁。因为内在锁没有公平性保证,所以这个线程有饥饿的风险,所以我的问题是:有没有好的/干净的方法来避免这种风险?例如,将任务计划为每1500毫秒运行一次(听起来不是很防水)?或者我们是否希望锁收购表现出一种“摊销公平”?是的,您可以使用:
创建并执行周期性操作,该操作在给定的初始延迟后首先启用,然后在一次执行结束和下一次执行开始之间的给定延迟。如果任务的任何执行遇到异常,则会抑制后续执行。否则,任务将仅通过取消或终止执行者而终止
因此,您给出的延迟是从最后一次结束到下一次开始之间的时间-即两次跑步之间没有重叠。哈哈,我真不敢相信我没有想到这一次。我想这和我脑子里的
日程安排
(即运行一次)有点混淆了。谢谢