我有一个使用阻塞队列的 ThreadPoolExecutor,我正在尝试调试一个问题,我怀疑任务在执行之前在 ThreadPoolExecutor 的队列中停留了太长时间。我正在尝试验证这个理论,并且想知道监控从排队到执行之前的长度的最佳方法是什么。
最佳答案
我偶尔使用的一个技巧是添加“跟踪器”任务来测量它们在队列中花费的时间。要测量时间,请获取添加任务时的时间戳,并将其与任务开始运行时的时间戳进行比较。最简单的形式是:
long time = System.nanoTime();
executorService.submit(() -> {
System.out.println("Queued for " + System.nanoTime() - time);
});
如果您主要关心等待时间超过固定阈值的任务,例如您需要在特定时间限制内得到响应,那么这是一个很好的解决方案。跟踪器任务在队列中等待的时间与实际任务一样长。如果超时时间为 1 分钟,则每 30 秒添加一次跟踪器可以让您很好地了解排队时间与 1 分钟的接近程度。它也非常容易实现,您可以将该技术应用于任何现有的执行器服务。
这只能告诉你提交这个任务时任务在队列中等待了多长时间,这可能太粗粒度了。如果您需要知道您提交的每个任务的排队时间,并且您愿意自定义执行器服务实现,您可以做更多的事情:
您可以创建包含时间测量的自定义 ExecutorService 实现。通过
submit
或invoke
方法添加任务时,您将记录任务的当前时间。当任务运行时,您计算并记录排队时间,例如在 beforeExecute method 中或者,您可以创建包含时间测量的自定义工作队列实现。当添加任务时,它会记录该任务的当前时间戳,当删除任务时,它会将当前时间戳与任务的时间戳进行比较。
关于java - Java ThreadPoolExecutor 测量任务在执行之前在队列中等待的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63310610/