如果线程已经忙,则使用newSingleThreadScheduledExecutor

我的要求是创建一个服务,该服务在特定间隔后继续检查队列并处理队列中的元素。

对于10秒后的调度任务,我正在使用:

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

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

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

所以当10秒后再次调用runnable时,它会停止前一个执行线程并启动新线程。 或者,它将检查线程是否已在运行,如果它正在运行,那么在这种情况下它将跳过Runnable内部。

newSingleThreadScheduledExecutor(); 创建一个具有单个线程的执行程序,该线程永远不会与现有线程并行执行任何操作。 它只有一个,并且线程一次不能执行超过1个。

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

所以当10秒后再次调用runnable时,它会停止前一个执行线程并启动新线程。

它不会阻止任何事情。 执行者重新使用他们的线程。 线程执行您按顺序提供给它的所有Runnable 。 因此,只要第一次完成,它就会执行下一个runnable。

或者,它将检查线程是否已在运行,如果它正在运行,那么在这种情况下它将跳过Runnable内部。

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

文档解释如下

如果此任务的执行时间超过其周期,则后续执行可能会延迟,但不会同时执行。

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


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