多线程测量任务在执行前在队列中等待的时间Java ThreadPoolExecutor
我有一个使用阻塞队列的ThreadPoolExecutor,我正在尝试调试一个问题,我怀疑任务在执行之前在ThreadPoolExecutor的队列中停留的时间太长。我试图验证这一理论,并想知道,从排队到执行之前,监控长度的最佳方法是什么
你可以在下面搜索框中键入要查询的问题!
我有一个使用阻塞队列的ThreadPoolExecutor,我正在尝试调试一个问题,我怀疑任务在执行之前在ThreadPoolExecutor的队列中停留的时间太长。我试图验证这一理论,并想知道,从排队到执行之前,监控长度的最佳方法是什么
# 1 楼答案
我偶尔使用的一个技巧是添加“跟踪器”任务,以测量它们在队列中花费的时间。要测量时间,请获取添加任务的时间戳,并将其与任务开始运行的时间戳进行比较。最简单的可能形式是:
如果您主要关心等待时间超过固定阈值的任务,例如如果您需要在特定时间限制内响应,那么这是一个很好的解决方案。跟踪器任务在队列中等待的时间与实际任务一样长。如果超时时间为1分钟,每30秒添加一个跟踪程序,可以很好地了解排队时间与1分钟的差距。它也很容易实现,您可以将该技术应用于任何现有的executor服务
这只能告诉您在提交此任务时,任务在队列中等待了多长时间,这可能过于粗粒度。如果您需要知道提交的每个任务的排队时间,并且愿意定制executor服务实现,您可以做更多事情:
可以创建包含时间度量的自定义ExecutorService实现。通过
submit
或invoke
方法添加任务时,记录任务的当前时间。当任务运行时,计算并记录排队时间,例如在beforeExecute method或者,您可以创建一个包含时间度量的自定义工作队列实现。当添加任务时,它会将当前时间戳与任务一起记录,当删除任务时,它会将当前时间戳与任务的时间戳进行比较