我的要求是提供一种在特定时间间隔后继续检查队列并处理队列中元素的服务。

为了在10秒后安排任务,我正在使用:

ScheduledExecutorService schd = Executors.newSingleThreadScheduledExecutor();
schd.scheduleAtFixedRate(readQueueRunnable, 10, 10, TimeUnit.SECONDS);

我的问题是假设第一次,队列中有许多元素,并且我的单个线程开始处理队列。

即使经过10秒,我的第一个线程仍在执行它。

因此,当10秒钟后,再次调用runnable时,它将停止先前执行的线程并启动新的线程。
或者,它将检查线程是否已经在运行,如果正在运行,则在这种情况下将跳过进入Runnable内部。

最佳答案

newSingleThreadScheduledExecutor();用单个线程创建一个执行程序,该执行程序永远不会与现有线程并行执行任何操作。它只有一个,线程一次不能执行多于一件的事情。

如果您的任务花费的时间超过10秒,它将在10秒后仍然创建一个新任务,并将其放入等待完成的任务队列中。如果任务花费的时间总是比您安排任务的时间长,您将获得一个不断增长的任务队列,并且在某个时候可能会发生与内存相关的崩溃。



它不会停止任何事情。执行程序重新使用其线程。线程按顺序执行您提供给它的所有Runnable。因此,一旦第一个可运行对象完成,它将简单地执行下一个可运行对象。



10秒后将不会跳过创建任务。

documentation像这样解释



“非并发”部分适用于具有多个线程的执行程序。这里不相关,因为那不可能发生。

如果您希望任务之间总是有10秒的延迟,请使用scheduleWithFixedDelay

10-07 19:17
查看更多