java - 如果当前线程 hibernate ,ThreadPoolExecutor 是否会生成新线程

标签 java multithreading threadpool blockingqueue

此问题是 this one 的后续问题.

本质上,我所做的就是声明一个只有一个线程的ThreadPoolExecutor。我正在重写 beforeExecute() 方法来进行 sleep ,以便我的每个任务在执行时都会有一些延迟。这基本上是为了将 CPU 交给其他线程,因为我的线程有点颠簸。

所以预期的行为是:

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

但这就是我所看到的:

对于提交的每个新任务:

  1. 它执行任务
  2. 调用 beforeExecute 方法
  3. sleep 时间例如 20 秒
  4. 重新执行任务!

1. 和 2. 的顺序并不总是相同。

这是我的问题:

  1. 似乎有一个新线程在 sleep 后/ sleep 期间进入,并在实际线程 sleep 时立即执行我的任务。
    那么,一旦现有线程 hibernate ,ThreadPoolExecutor 是否会生成一个新线程[认为该线程已终止]? 我尝试将 keepAliveTime > sleeptime ..这样,如果上述断言为真..它至少会等待超过 sleep 时间来生成新线程...[希望同时 sleep 线程会被唤醒并且ThreadPoolExecutor 会转储产生新线程的想法
  2. 即使它确实生成了一个新线程并立即执行我的任务,为什么在 hibernate 线程唤醒后任务会重新执行!!之前任务不是应该从任务队列中取出吗?
  3. 我在这里遗漏了什么吗?还有其他方法可以调试此场景吗?

=> 我正在考虑执行所需任务[而不是解决问题]的另一种方法是用另一个可运行对象包装可运行对象,并在调用内部可运行对象之前 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/

相关文章:

java - 处理对象数组

c++ - boost::thread join 函数 block 调用线程

Python:线程中的执行顺序

threadpool - Spring中最大(客户端请求)线程池大小

python - 如何使用共享内存而不是通过多个进程之间的酸洗来传递对象

java - 这些操作中哪一个在节省内存和 CPU 方面更好? ( java )

java - JUNG力有向图

c++ - 从 usleep 中唤醒一个 std::thread

c# - MySql.Data 'new Thread' 与 ThreadPool : using ThreadPool creates a deadlock

java - Servlet 和 JSP : Adding parameters to a href that routes to a servlet