这个问题是对这个问题的跟进。
本质上,我正在做的是ThreadPoolExecutor
只用一个线程声明 a 。我正在重写该beforeExecute()
方法以使睡眠,以便我的每个任务在它们之间都有一些延迟执行。这基本上是为了将 CPU 交给其他线程,因为我的线程有点颠簸。
所以预期的行为是:
对于 中的每个新任务ThreadPoolExecutor
,它会在执行任务之前调用 before execute 函数,因此它会在执行任务之前休眠 20 秒。
然而,这就是我所看到的:
对于提交的每个新任务:
- 它执行任务
- 调用 beforeExecute 方法
- 睡了 20 多岁
- 重新执行任务!
1. & 2. 的顺序并不总是相同的。
以下是我的问题:
- 似乎有一个新线程在睡眠之后/期间进入,并在实际线程处于睡眠状态时立即执行我的任务。
那么ThreadPoolExecutor
一旦现有线程休眠[认为线程已终止],是否会产生一个新线程?我试图把 keepAliveTime > sleeptime ..这样如果上面的断言是真的..它至少等待超过睡眠时间来产生一个新线程......[希望同时睡眠线程会被唤醒并且会ThreadPoolExecutor
抛弃产生新线程的想法 - 即使它确实产生了一个新线程并立即执行我的任务,为什么在睡眠线程唤醒后要重新执行任务!在此之前不应该将任务从任务队列中取出吗?
- 我在这里错过了什么吗?还有其他方法可以调试这种情况吗?
=>我正在考虑完成所需任务[而不是解决问题]的另一种方法是用一个可运行的可运行文件包装可运行文件,并在调用内部可运行文件之前休眠外部可运行文件。