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

标签 java multithreading threadpoolexecutor

我有一个使用阻塞队列的 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/

相关文章:

java - 如何在没有请求者签名的情况下用 Java 生成 CSR?

Java 的 Swing 线程

multithreading - ThreadPoolExecutor 与 threading.Thread

Java - 声明泛型函数的正确方法?

java - 我的java程序输出错误

java - 如何优化我糟糕的代码以找到 3 位数字的最高回文数?

c - 多线程 C qsort char 数组

java - 删除连续行后动态更新 JTable 行

java - 为什么缓存线程池会创建两个线程,为什么关闭它会改变这种情况?

java - ThreadPoolExecutor的配置