如果线程已经忙,则使用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