0

这个问题是对这个问题的跟进。

本质上,我正在做的是ThreadPoolExecutor只用一个线程声明 a 。我正在重写该beforeExecute()方法以使睡眠,以便我的每个任务在它们之间都有一些延迟执行。这基本上是为了将 CPU 交给其他线程,因为我的线程有点颠簸。

所以预期的行为是:

对于 中的每个新任务ThreadPoolExecutor,它会在执行任务之前调用 before execute 函数,因此它会在执行任务之前休眠 20 秒。

然而,这就是我所看到的:

对于提交的每个新任务:

  1. 它执行任务
  2. 调用 beforeExecute 方法
  3. 睡了 20 多岁
  4. 重新执行任务!

1. & 2. 的顺序并不总是相同的。

以下是我的问题:

  1. 似乎有一个新线程在睡眠之后/期间进入,并在实际线程处于睡眠状态时立即执行我的任务。
    那么ThreadPoolExecutor一旦现有线程休眠[认为线程已终止],是否会产生一个新线程?我试图把 keepAliveTime > sleeptime ..这样如果上面的断言是真的..它至少等待超过睡眠时间来产生一个新线程......[希望同时睡眠线程会被唤醒并且会ThreadPoolExecutor抛弃产生新线程的想法
  2. 即使它确实产生了一个新线程并立即执行我的任务,为什么在睡眠线程唤醒后要重新执行任务!在此之前不应该将任务从任务队列中取出吗?
  3. 我在这里错过了什么吗?还有其他方法可以调试这种情况吗?

=>我正在考虑完成所需任务[而不是解决问题]的另一种方法是用一个可运行的可运行文件包装可运行文件,并在调用内部可运行文件之前休眠外部可运行文件。

4

2 回答 2

2

我认为您正在寻找的是ScheduledExecutorService

据我了解您的问题, scheduleAtFixedRate(...) 应该做的交易:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,随后在给定的周期内启用;也就是说,执行将在 initialDelay 之后开始,然后是 initialDelay+period,然后是 initialDelay + 2 * period,依此类推。

于 2010-10-07T18:27:21.637 回答
0
  1. 不,这不是它的工作原理。ThreadPoolExecutor知道它有一个工作线程,即使该工作线程是、RUNNABLEWAITINGBLOCKED任何其他状态。
  2. 该任务在方法被调用BlockingQueue之前很久就被删除了。beforeExecute
  3. 您可以自己查看 API 的代码并确定它在做什么。每个 Java JDK 安装都包含一个“src.zip”文件,其中包含整个 Java 库。如果你还没有,你可以在 eclipse 中附加这个源代码,然后在 eclipse 中调试时潜入库方法将显示源代码而不仅仅是类文件。
于 2010-10-07T20:33:05.930 回答