有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

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

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