我的要求是制作一个服务,在特定的时间间隔后继续检查队列。处理队列中的元素。
对于10秒后的调度任务,我正在使用:
ScheduledExecutorService schd = Executors.newSingleThreadScheduledExecutor();
schd.scheduleAtFixedRate(readQueueRunnable, 10, 10, TimeUnit.SECONDS);
我的问题是假设第一次,在队列中有许多元素,我的单线程开始处理队列。
即使10秒后我的第一个线程仍在执行它。
因此,当10秒后再次调用runnable时,它是否会停止上一个执行线程并启动新线程。 或者,它将检查线程是否已在运行&如果它正在运行,那么在这种情况下它将跳过Runnable内部。
答案 0 :(得分:9)
newSingleThreadScheduledExecutor();
创建一个具有单个线程的执行程序,该线程永远不会与现有线程并行执行任何操作。它只有一个,并且线程一次不能执行多于一件事。
如果您的任务花费的时间超过10秒,它仍会在10秒后创建一个新任务,并将其放入等待完成的任务队列中。如果任务总是花费的时间超过您安排它们的速度,那么您将获得一个不断增长的任务队列,并且可能在某些时候发生与内存相关的崩溃。
因此,当10秒后再次调用runnable时,它是否会停止上一个执行线程并启动新线程。
它不会阻止任何事情。执行者重新使用他们的线程。线程执行您按顺序提供给它的所有Runnable
。因此,只要第一次完成,它就会执行下一个runnable。
或者,它将检查线程是否已在运行&如果它正在运行,那么在这种情况下它将跳过Runnable内部。
10秒后不会跳过创建任务。
如果执行此任务的时间超过其周期,则后续执行可能会延迟,但不会同时执行。
"不同时" part适用于具有多个线程的执行程序。这里不相关,因为那不可能发生。
如果您希望任务之间总有10秒延迟,请使用scheduleWithFixedDelay