如果当前线程休眠,ThreadPoolExecutor是否会生成一个新线程

时间:2010-10-07 18:15:47

标签: java multithreading threadpool blockingqueue

这个问题是this one的后续问题。

基本上我正在做的是用一个线程声明ThreadPoolExecutor。我重写了beforeExecute()方法来进行睡眠,这样我的每个任务都会在它们之间执行一些延迟。这基本上是为了将CPU送到其他线程,因为我的线程有点颠簸。

所以预期的行为是:

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

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

对于提交的每个新任务:

  1. 执行任务
  2. 调用beforeExecute方法
  3. 睡觉说20秒
  4. 重新执行任务!
  5. 顺序为1.& 2.不是一直都是一样的。

    以下是我的问题:

    1. 出现了一个新线程在睡眠之后/期间进入并且在实际线程处于休眠状态时继续执行我的任务。
      一旦现有线程休眠[认为线程被终止],ThreadPoolExecutor就会产生一个新线程吗? 我试着把keepAliveTime> sleeptime ..所以,如果上面的断言是真的..它至少等待超过睡眠时间产生一个新线程... [希望平均时间睡眠线程将醒来,ThreadPoolExecutor将抛弃产生新线程的想法
    2. 即使它确实产生了一个新线程并立即执行我的任务,为什么在睡眠线程唤醒后重新执行该任务!!在此之前不应该从任务队列中取出任务吗??
    3. 我在这里遗漏了什么吗?还有其他调试方案的方法吗?
    4. =>我正在考虑执行所需任务[而不是解决peoblem]的另一种方法是将runnable包装为另一个runnable并在调用内部runnable之前调用外部runnable。

2 个答案:

答案 0 :(得分:2)

我认为你要找的是ScheduledExecutorService

根据我对你的问题的理解,scheduleAtFixedRate(...)应该做这笔交易:

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

创建并执行定期操作   在...之后首先启用   给出初始延迟,然后   在给定的时期内;那是   执行将在之后开始   initialDelay然后是initialDelay + period,   然后是initialDelay + 2 *期间,等等   上。

答案 1 :(得分:0)

  1. 不,这不是它的工作原理。 ThreadPoolExecutor知道它有一个工作线程,即使该工作者是RUNNABLEWAITINGBLOCKED或任何其他州。
  2. 在调用BlockingQueue方法之前很久就会从beforeExecute删除该任务。
  3. 您可以自己查看API的代码并确定它在做什么。每个Java JDK安装都包含一个“src.zip”文件,其中包含整个Java库。如果你还没有,你可以在eclipse中附加这个源,然后在eclipse中调试潜入库方法时会显示源而不仅仅是类文件。