【问题标题】:Measure time a tasks waits in queue before being executed Java ThreadPoolExecutor测量任务在执行之前在队列中等待的时间 Java ThreadPoolExecutor
【发布时间】:2020-08-08 00:18:52
【问题描述】:

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

【问题讨论】:

    标签: java multithreading threadpoolexecutor


    【解决方案1】:

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

        long time = System.nanoTime();
        executorService.submit(() -> {
            System.out.println("Queued for " + System.nanoTime() - time);
        });
    

    如果您主要关心等待时间超过固定阈值的任务,这是一个很好的解决方案,例如您需要在特定时间限制内响应。跟踪器任务在队列中等待的时间与实际任务一样长。如果您有 1 分钟的超时,则每 30 秒添加一个跟踪器可以让您很好地了解排队时间与 1 分钟的接近程度。它也很容易实现,您可以将该技术应用于任何现有的执行器服务。

    这只能告诉你提交这个任务时任务在队列中等待了多长时间,这可能太粗粒度了。如果您需要知道您提交的每个任务的排队时间,并且您愿意自定义执行器服务实现,您可以做更多的事情:

    • 您可以创建包含时间测量的自定义 ExecutorService 实现。当通过submitinvoke 方法添加任务时,您将记录任务的当前时间。当任务运行时,您计算并记录排队时间,例如在beforeExecute method

    • 或者,您可以创建一个包含时间测量的自定义工作队列实现。添加任务时,会与任务记录当前时间戳,移除任务时,会将当前时间戳与任务的时间戳进行比较。

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 2017-07-18
      • 2011-04-21
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2023-03-26
      相关资源
      最近更新 更多