gpt4 book ai didi

java - 测量任务在执行之前在队列中等待的时间Java ThreadPoolExecutor

转载 作者:行者123 更新时间:2023-12-03 12:53:49 27 4
gpt4 key购买 nike

我有一个使用阻塞队列的ThreadPoolExecutor,并且正在尝试调试一个问题,在该问题中,我怀疑任务在ThreadPoolExecutor的队列中停留的时间太长,无法执行。我正在尝试验证这一理论,并想知道什么是在执行之前监视从入队到结束的长度的最佳方法。

最佳答案

我偶尔使用的一个技巧是添加“跟踪器”任务,以衡量它们在队列中花费的时间。要测量时间,请获取添加任务的时间戳,并将其与任务开始运行的时间戳进行比较。最简单的形式是:

    long time = System.nanoTime();
executorService.submit(() -> {
System.out.println("Queued for " + System.nanoTime() - time);
});
如果您主要关心等待时间超过固定阈值的任务(例如,您需要在一定时间限制内进行响应),则这是一个很好的解决方案。跟踪程序任务在队列中的等待时间与实际任务一样长。如果超时时间为1分钟,则每30秒添加一个跟踪器可以使您很好地了解排队时间与1分钟的接近程度。它也很容易实现,您可以将该技术应用于任何现有的执行程序服务。
这只能告诉您在提交此任务时,队列中的任务等待了多长时间,这可能太粗糙了。如果您需要知道提交的每个任务的排队时间,并且愿意自定义执行程序服务的实现,则可以做更多的事情:
  • 您可以创建一个包含时间度量的自定义ExecutorService实现。通过submitinvoke方法添加任务时,您将记录任务的当前时间。任务运行时,您可以计算并记录排队时间,例如在beforeExecute method
  • 或者,您可以创建一个包含时间度量的自定义工作队列实现。添加任务后,它将与任务一起记录当前时间戳,而删除任务后,它将将当前时间戳与任务的时间戳进行比较。
  • 关于java - 测量任务在执行之前在队列中等待的时间Java ThreadPoolExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63310610/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com