Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.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—如何避免周期性操作执行重叠_Java_Android_Java.util.concurrent - Fatal编程技术网

Java—如何避免周期性操作执行重叠

Java—如何避免周期性操作执行重叠,java,android,java.util.concurrent,Java,Android,Java.util.concurrent,我的应用程序中需要执行一些周期性操作,例如周期T。现在,我使用的是Timer.scheduleAtFixedRate(TimerTask,0,T)。现在我想避免单个操作的重叠(在某些情况下,单个操作可能比T花费更多的时间)。我读过Timer实现,它使用单个线程执行操作,因此在标准情况下不会有重叠。问题是,在我的例子中,单个操作不是由传递给Timer的TimerTask直接执行的:操作只是从它开始的,它们是异步执行的 因此,如果一个TimerTask执行在前一个操作完成之前启动一个新操作,则可能会

我的应用程序中需要执行一些周期性操作,例如周期
T
。现在,我使用的是
Timer.scheduleAtFixedRate(TimerTask,0,T)
。现在我想避免单个操作的重叠(在某些情况下,单个操作可能比
T
花费更多的时间)。我读过
Timer
实现,它使用单个线程执行操作,因此在标准情况下不会有重叠。问题是,在我的例子中,单个操作不是由传递给
Timer
TimerTask
直接执行的:操作只是从它开始的,它们是异步执行的

因此,如果一个
TimerTask
执行在前一个操作完成之前启动一个新操作,则可能会出现重叠。相反,如果发生重叠,我希望等待上一次执行的终止,并在上一次执行完成后立即开始新的操作


获得这种行为的最佳实现是什么?我应该从计时器切换到其他支持吗?这是Android环境,所以我更喜欢Java标准(
util.concurrent
)或一些基于Android的实现,而不是基于Spring Quartz和其他特定框架的实现。

您可以使用它来实现这一点。它比计时器{,任务}

更容易使用,为什么不在当前任务的末尾安排下一个任务呢?这将解决您的所有问题,如果您的任务持续时间比TIt的解决方案稍微短一点,将避免电池耗尽,但通过这种方式,我需要明确控制执行周期,记住开始时间戳,验证执行所需的时间,等等。。难道没有更优雅的解决方案吗?PS:您能更好地解释一下,如果任务持续时间略小于T,这个特定的解决方案将如何节省电池?您告诉我,您的任务有时需要超过T秒,因为您害怕重叠。这意味着,如果您的任务是T减去1秒,那么您的任务将以T-1s的持续时间每T运行一次,这意味着您只有1秒的时间不使用电池。在第一个任务结束后的T秒后安排第二个任务将为您提供T秒而不会耗尽电池。。或者我可能误解了什么?不,T必须是一个精确的周期,当一个操作花费的时间小于T时。这意味着,如果操作“n”从T0(n)开始,下一个操作必须从T0(n)+T开始。。。只有当操作n花费的时间超过T时,才应该延迟。然后T(n+1)=max(T0(n)+T,Tf(n)),其中Tf是操作n完成时的值。如何确保单个操作不会重叠?即使创建一个单线程池,正如我写的那样,单线程操作也是异步的,不能由线程直接执行;由于只有一个线程,在前一个任务未完成之前,第二个任务将不会执行。即使计时器和TimerTask也会异步执行,因为它们在单独的线程中执行。我写了一个不同的想法。在我的例子中,单个操作是异步的,因此线程在执行操作时并不繁忙。它的执行只是为了启动在后台完成的操作。所以多个线程执行将开始并发执行该操作,我想避免这样做。请再次阅读我所说的。如果使用了单线程池执行器,则如果上一个操作未完成,则第二个任务将不会开始执行。否。操作的执行不限于启动它的线程的执行。线程启动操作,然后线程完成执行,但操作仍在后台执行。因此,即使只有一个线程,即使操作没有完成,也可能会有第二次执行,启动第二个操作,与第一个操作并发。此外,TimerTask实现也是单线程的。