此问题是 this one 的后续问题.
本质上,我所做的就是声明一个只有一个线程的ThreadPoolExecutor
。我正在重写 beforeExecute()
方法来进行 sleep ,以便我的每个任务在执行时都会有一些延迟。这基本上是为了将 CPU 交给其他线程,因为我的线程有点颠簸。
所以预期的行为是:
对于 ThreadPoolExecutor 中的每个新任务,它会在执行任务之前调用 beforeexecute 函数,因此在执行任务之前会 hibernate 20 秒。
但这就是我所看到的:
对于提交的每个新任务:
- 它执行任务
- 调用 beforeExecute 方法
- sleep 时间例如 20 秒
- 重新执行任务!
1. 和 2. 的顺序并不总是相同。
这是我的问题:
- 似乎有一个新线程在 sleep 后/ sleep 期间进入,并在实际线程 sleep 时立即执行我的任务。
那么,一旦现有线程 hibernate ,ThreadPoolExecutor
是否会生成一个新线程[认为该线程已终止]? 我尝试将 keepAliveTime > sleeptime ..这样,如果上述断言为真..它至少会等待超过 sleep 时间来生成新线程...[希望同时 sleep 线程会被唤醒并且ThreadPoolExecutor
会转储产生新线程的想法 - 即使它确实生成了一个新线程并立即执行我的任务,为什么在 hibernate 线程唤醒后任务会重新执行!!之前任务不是应该从任务队列中取出吗?
- 我在这里遗漏了什么吗?还有其他方法可以调试此场景吗?
=> 我正在考虑执行所需任务[而不是解决问题]的另一种方法是用另一个可运行对象包装可运行对象,并在调用内部可运行对象之前 hibernate 外部可运行对象。
最佳答案
我认为您正在寻找的是 ScheduledExecutorService
根据我对你的问题的理解,scheduleAtFixedRate(...) 应该完成这笔交易:
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given period; that is executions will commence after initialDelay then initialDelay+period, then initialDelay + 2 * period, and so on.
关于java - 如果当前线程 hibernate ,ThreadPoolExecutor 是否会生成新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3884581/