开云app官方在线 简单方法实现子任务耗时统计

发布日期:2026-01-20 01:08    点击次数:120

开云app官方在线 简单方法实现子任务耗时统计

背景在并发编程中,我们经常需要将一个大任务拆分成多个子任务并行执行。但随之而来的问题是:如何准确统计每个子任务的耗时? 传统的做法是在业务代码中手动埋点,但这样会导致代码侵入性强、难以维护。本文介绍一种基于装饰器模式的优雅实现方案。

核心思路通过包装 Callable 接口,在任务执行前后自动记录时间戳,开云app实现对任务生命周期各阶段的监控:

Timeline: submitTime -> startTime -> endTime

+-- 等待时间 --+-- 执行时间 --+

| |

+------- 总耗时 ---------- #后端 #Java #监控-+

代码实现1. 定义时间记录字段public class ScopedCallable implements Callable {

private static final long NANO_TO_MS = 1_000_000L;

/** 任务名称 */ private final String taskName;

/** 被包装的实际任务 */ private final Callable delegate;

/** 任务提交时间 (纳秒) */ private final long submitTime;

/** 任务开始执行时间 (纳秒) */ private long startTime;

/** 任务执行结束时间 (纳秒) */ private long endTime; }

2. 在构造函数中记录提交时间public ScopedCallable(String taskName, Callable delegate) {

this.taskName = Objects.requireNonNull(taskName);

this.delegate = Objects.requireNonNull(delegate);

this.submitTime = System.nanoTime; // 记录提交时间

}

C 3. 在 call 方法中记录执行时间@Override

public V call throws Exception {

try {

startTime = System.nanoTime; // 记录开始时间

return delegate.call; // 执行实际任务

} finally {

endTime = System.nanoTime; // 记录结束时间

reportMetrics; // 上报监控指标

}

}

4. 计算各阶段耗时/**

{jz:field.toptypename/}

public long executionTime { return endTime -

}

/**

public long waitTime { return startTime -

}

/**

public long totalTime { return endTime -

}

5. 上报监控指标private void reportMetrics {

long execMs = executionTime / NANO_TO_MS;

long waitMs = waitTime / NANO_TO_MS;

long totalMs = totalTime / NANO_TO_MS;

System.out.println("[" + taskName + "] 执行耗时: " + execMs + "ms"); System.out.println("[" + taskName + "] 等待耗时: " + waitMs + "ms"); System.out.println("[" +

}

使用示例public static void main(String[] args) throws Exception {

ExecutorService executor = Executors.newFixedThreadPool(2);

// 提交包装后的任务 Future future = executor.submit( new ScopedCallable("queryDB", -> { Thread.sleep(100); // 模拟耗时操作 return "result"; }) );

System.out.println("结果: " + future.get); executor.shutdown; }

输出示例:

[queryDB] 执行耗时: 102ms

{jz:field.toptypename/}

[queryDB] 等待耗时: 0ms

[queryDB] 总耗时: 102ms

结果: result

总结通过装饰器模式包装 Callable ,可以优雅地实现: 提交时间、等待时间、执行时间 的自动采集监控指标 的自动上报这种方案的核心优势是 零侵入 ——业务代码无需修改,只需在任务提交处统一包装即可。




Powered by 开云app官方在线入口 @2013-2022 RSS地图 HTML地图

Powered by365站群