【问题标题】:Working of newSingleThreadScheduledExecutor, if thread already busy如果线程已经忙,newSingleThreadScheduledExecutor 的工作
【发布时间】:2014-01-29 16:23:32
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

标签: java android


【解决方案1】:

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

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

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

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

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

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

documentation 是这样解释的

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

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


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

【讨论】:

  • 我可以为同一个worker提供2个不同的runnables吗?
  • @JaydevKalivarapu 不确定您的意思,但您可以根据需要安排尽可能多的不同可运行对象。
  • 如果我想避免内存泄漏,说在一个操作和另一个操作之间必须经过 10 秒,但如果一个操作持续 30 秒,则它不会保留 3 倍的等待时间?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多