这个问题是this one的后续问题。
基本上我正在做的是用一个线程声明ThreadPoolExecutor
。我重写了beforeExecute()
方法来进行睡眠,这样我的每个任务都会在它们之间执行一些延迟。这基本上是为了将CPU送到其他线程,因为我的线程有点颠簸。
所以预期的行为是:
对于ThreadPoolExecutor
中的每个新任务,它在执行任务之前调用before execute函数,因此在执行任务之前它会休眠20秒。
然而,这就是我所看到的:
对于提交的每个新任务:
顺序为1.& 2.不是一直都是一样的。
以下是我的问题:
ThreadPoolExecutor
就会产生一个新线程吗?
我试着把keepAliveTime> sleeptime ..所以,如果上面的断言是真的..它至少等待超过睡眠时间产生一个新线程... [希望平均时间睡眠线程将醒来,ThreadPoolExecutor
将抛弃产生新线程的想法=>我正在考虑执行所需任务[而不是解决peoblem]的另一种方法是将runnable包装为另一个runnable并在调用内部runnable之前调用外部runnable。
答案 0 :(得分:2)
我认为你要找的是ScheduledExecutorService
根据我对你的问题的理解,scheduleAtFixedRate(...)应该做这笔交易:
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
创建并执行定期操作 在...之后首先启用 给出初始延迟,然后 在给定的时期内;那是 执行将在之后开始 initialDelay然后是initialDelay + period, 然后是initialDelay + 2 *期间,等等 上。
答案 1 :(得分:0)
ThreadPoolExecutor
知道它有一个工作线程,即使该工作者是RUNNABLE
,WAITING
,BLOCKED
或任何其他州。BlockingQueue
方法之前很久就会从beforeExecute
删除该任务。