最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java簡單方法實現(xiàn)子任務(wù)耗時統(tǒng)計

 更新時間:2026年01月13日 09:08:19   作者:樺說編程  
在并發(fā)編程中,我們經(jīng)常需要將一個大任務(wù)拆分成多個子任務(wù)并行執(zhí)行,但隨之而來的問題是如何準(zhǔn)確統(tǒng)計每個子任務(wù)的耗時,下面我們來看看如何使用Java實現(xiàn)吧

背景

在并發(fā)編程中,我們經(jīng)常需要將一個大任務(wù)拆分成多個子任務(wù)并行執(zhí)行。但隨之而來的問題是:如何準(zhǔn)確統(tǒng)計每個子任務(wù)的耗時?

傳統(tǒng)的做法是在業(yè)務(wù)代碼中手動埋點,但這樣會導(dǎo)致代碼侵入性強、難以維護。本文介紹一種基于裝飾器模式的優(yōu)雅實現(xiàn)方案。

核心思路

通過包裝 Callable 接口,在任務(wù)執(zhí)行前后自動記錄時間戳,實現(xiàn)對任務(wù)生命周期各階段的監(jiān)控:

Timeline: submitTime -> startTime -> endTime
              |            |           |
              +-- 等待時間 --+-- 執(zhí)行時間 --+
              |                         |
              +------- 總耗時 -----------+

代碼實現(xiàn)

1. 定義時間記錄字段

public class ScopedCallable<V> implements Callable<V> {

    private static final long NANO_TO_MS = 1_000_000L;

    /** 任務(wù)名稱 */
    private final String taskName;

    /** 被包裝的實際任務(wù) */
    private final Callable<V> delegate;

    /** 任務(wù)提交時間 (納秒) */
    private final long submitTime;

    /** 任務(wù)開始執(zhí)行時間 (納秒) */
    private long startTime;

    /** 任務(wù)執(zhí)行結(jié)束時間 (納秒) */
    private long endTime;
}

2. 在構(gòu)造函數(shù)中記錄提交時間

public ScopedCallable(String taskName, Callable<V> delegate) {
    this.taskName = Objects.requireNonNull(taskName);
    this.delegate = Objects.requireNonNull(delegate);
    this.submitTime = System.nanoTime();  // 記錄提交時間
}

3. 在 call() 方法中記錄執(zhí)行時間

@Override
public V call() throws Exception {
    try {
        startTime = System.nanoTime();   // 記錄開始時間
        return delegate.call();           // 執(zhí)行實際任務(wù)
    } finally {
        endTime = System.nanoTime();      // 記錄結(jié)束時間
        reportMetrics();                  // 上報監(jiān)控指標(biāo)
    }
}

4. 計算各階段耗時

/** 執(zhí)行耗時 = 結(jié)束時間 - 開始時間 */
public long executionTime() {
    return endTime - startTime;
}

/** 等待耗時 = 開始時間 - 提交時間 */
public long waitTime() {
    return startTime - submitTime;
}

/** 總耗時 = 結(jié)束時間 - 提交時間 */
public long totalTime() {
    return endTime - submitTime;
}

5. 上報監(jiān)控指標(biāo)

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 + "] 執(zhí)行耗時: " + execMs + "ms");
    System.out.println("[" + taskName + "] 等待耗時: " + waitMs + "ms");
    System.out.println("[" + taskName + "] 總耗時: " + totalMs + "ms");
}

設(shè)計要點

要點說明
納秒精度使用 System.nanoTime() 而非 currentTimeMillis(),精度更高且不受系統(tǒng)時鐘調(diào)整影響
finally 塊確保即使任務(wù)拋異常也能記錄結(jié)束時間
透明包裝對業(yè)務(wù)代碼無侵入,只需在提交任務(wù)時包裝一層

使用示例

public static void main(String[] args) throws Exception {
    ExecutorService executor = Executors.newFixedThreadPool(2);

    // 提交包裝后的任務(wù)
    Future<String> future = executor.submit(
        new ScopedCallable<>("queryDB", () -> {
            Thread.sleep(100);  // 模擬耗時操作
            return "result";
        })
    );

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

輸出示例:

[queryDB] 執(zhí)行耗時: 102ms
[queryDB] 等待耗時: 0ms
[queryDB] 總耗時: 102ms
結(jié)果: result

總結(jié)

通過裝飾器模式包裝 Callable,可以優(yōu)雅地實現(xiàn):

  • 提交時間、等待時間、執(zhí)行時間 的自動采集
  • 監(jiān)控指標(biāo) 的自動上報

這種方案的核心優(yōu)勢是零侵入——業(yè)務(wù)代碼無需修改,只需在任務(wù)提交處統(tǒng)一包裝即可。

到此這篇關(guān)于Java簡單方法實現(xiàn)子任務(wù)耗時統(tǒng)計的文章就介紹到這了,更多相關(guān)Java統(tǒng)計任務(wù)耗時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 常用注解整理(最全收藏版)

    Spring Boot 常用注解整理(最全收藏版)

    本文系統(tǒng)整理了常用的 Spring/Spring Boot 注解,按照功能分類進行介紹,每個注解都會涵蓋其含義、提供來源、應(yīng)用場景以及代碼示例,幫助開發(fā)者深入理解和快速檢索,感興趣的朋友跟隨小編一起看看吧
    2025-05-05
  • JavaEE Filter敏感詞過濾的方法實例詳解

    JavaEE Filter敏感詞過濾的方法實例詳解

    我們無論是在聊天還是在留言時,都有一些信息不希望別人看到。那么如果過濾這些關(guān)鍵詞呢?下面小編給大家分享JavaEE Filter敏感詞過濾的方法實例詳解,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • JMeter中的后端監(jiān)聽器的實現(xiàn)

    JMeter中的后端監(jiān)聽器的實現(xiàn)

    本文主要介紹了JMeter中的后端監(jiān)聽器的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java使用utf8格式保存文本文件的方法

    Java使用utf8格式保存文本文件的方法

    這篇文章主要介紹了Java使用utf8格式保存文本文件的方法,涉及Java針對字符流編碼操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • Spring整合WebSocket應(yīng)用示例(上)

    Spring整合WebSocket應(yīng)用示例(上)

    以下教程是小編在參與開發(fā)公司的一個crm系統(tǒng),整理些相關(guān)資料,在該系統(tǒng)中有很多消息推送功能,在其中用到了websocket技術(shù)。下面小編整理分享到腳本之家平臺供大家參考
    2016-04-04
  • 解決spring boot環(huán)境切換失效的問題

    解決spring boot環(huán)境切換失效的問題

    這篇文章主要介紹了解決spring boot環(huán)境切換失效的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java Object類方法原理和使用場景

    Java Object類方法原理和使用場景

    本文詳細介紹了Java中Object類的幾個重要方法,包括clone()、getClass()、toString()、finalize()、equals()和hashCode(),以及wait()、notify()、notifyAll(),每個方法的使用場景、特點和最佳實踐都被逐一解釋,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java 實現(xiàn)repalceAll只替換第二個匹配到的字符串

    Java 實現(xiàn)repalceAll只替換第二個匹配到的字符串

    這篇文章主要介紹了Java 實現(xiàn)repalceAll只替換第二個匹配到的字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于mybatis-plus QueryWrapper 排序的坑

    基于mybatis-plus QueryWrapper 排序的坑

    這篇文章主要介紹了mybatis-plus QueryWrapper 排序的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java如何執(zhí)行l(wèi)inux/cmd命令

    java如何執(zhí)行l(wèi)inux/cmd命令

    本文詳細介紹了在Java中執(zhí)行命令行命令的兩種方法:Runtime.exec()和ProcessBuilder,包括它們的優(yōu)缺點、參數(shù)傳遞、流處理、多線程處理、超時控制、跨平臺兼容性和亂碼問題的解決方案
    2026-01-01

最新評論

永嘉县| 合山市| 阜阳市| 保靖县| 辛集市| 分宜县| 乌海市| 马鞍山市| 平乐县| 乐东| 乌兰浩特市| 贵州省| 青海省| 延边| 福建省| 清苑县| 钟祥市| 高唐县| 新余市| 涿鹿县| 普安县| 孝感市| 永济市| 锦屏县| 鄂托克前旗| 高雄县| 阳春市| 中超| 资源县| 温泉县| 阳春市| 苗栗县| 诸暨市| 温宿县| 长海县| 济源市| 岚皋县| 兰西县| 霍山县| 寻乌县| 托里县|