2010-10-07 83 views
0

这个问题上this one一个后续。确实的ThreadPoolExecutor产生一个新的线程,如果当前线程休眠

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

所以,预期的行为是:

对于在ThreadPoolExecutor每一个新的任务,它在执行任务之前调用之前执行的功能,因此它休眠比如说20年代它执行任务之前。

然而,这是我所看到的:

对于提交的每一个新任务:

  1. 它执行任务
  2. 调用beforeExecute方法
  3. 休眠比如说20多岁
  4. 重新执行任务!

1.的顺序& 2.一直都不一样。

这里是我的问题:/睡眠期间

  1. 它出现了一个新的线程进来后继续运行并执行我的任务马上而实际线程处于休眠状态。
    因此,一旦现有的线程休眠做的ThreadPoolExecutor产生新线程[思考该线程终止]? 我试图把KeepAliveTime的>睡眠时间..所以,在情况下,上面的表述是真实的..它ATLEAST等待的时间超过睡眠时间,以产生一个新的线程... [希望能在平均时间休眠线程都睡不着和ThreadPoolExecutor将转储产生一个新的线程
  2. 即使它不产生一个新的线程,并执行我的任务马上的想法,为什么会任务重新执行休眠线程醒来后!在此之前不应该将任务从队列中取出吗?
  3. 我在这里错过了什么吗?任何其他方式来调试这种情况?

=>我正在考虑完成所需任务(而不是解决问题)的另一种方法是将runnable封装为一个可运行的代码,然后在调用内部代码之前先休眠外部可运行的代码。

回答

2

我想你要找的是一个ScheduledExecutorService

从我明白你的问题,scheduleAtFixedRate(的...)应该做这笔交易:

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

创建并执行一个在 给定初始延迟后首次启用的定期操作 ,随后与给定的周期 ;即 执行后将开始 initialDelay然后initialDelay +期间, 然后initialDelay + 2 *期间,所以 上。

+0

thnx指出这..这是一些接近,但不完全是我想要的。基本上这里的下一个任务是基于时间= 0进行计划的。因此,不管执行我的预先任务的时间如何,新任务都会被踢掉。 [在多线程env中,不能保证它是否等间距] ..............................它会是很高兴有一个新的任务,只有在先前一个完成后的一些延迟启动..但是,我可能会稍后再给这个.. – codeObserver 2010-10-07 18:41:26

+0

我注意到有一种方法scheduleWithFixedDelay可能适合我.. – codeObserver 2010-10-07 18:51:40

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