Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 阻止时间超过其运行间隔的ScheduledExecutorService任务_Java_Multithreading_Locking_Threadpoolexecutor_Starvation - Fatal编程技术网

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毫秒运行一次(听起来不是很防水)?或者我们是否希望锁收购表现出一种“摊销公平”?

是的,您可以使用:

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


因此,您给出的延迟是从最后一次结束到下一次开始之间的时间-即两次跑步之间没有重叠。

哈哈,我真不敢相信我没有想到这一次。我想这和我脑子里的
日程安排
(即运行一次)有点混淆了。谢谢