日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

log(四)——MDC使用

發布時間:2024/3/13 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 log(四)——MDC使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?1.MDC put

用MDC的put方法,把需要的context添加到當前線程的context map中。

之前說過,子線程在創建的時候會把父線程中的inheritableThreadLocals變量設置到子線程的inheritableThreadLocals中,而MDC內部是用InheritableThreadLocal實現的,所以自然會把父線程中的上下文帶到子線程中。

2.getCopyOfContextMap

對于線程池中的線程來說,這部分線程是可以重用的,但是線程本身只會初始化一次,所以之后重用線程的時候,就不會進行初始化操作了,也就不會有上一段中提到的父線程inheritableThreadLocals拷貝到子線程中的過程了。

這個時候如果還想傳遞父線程的上下文的話,就要使用getCopyOfContextMap方法。

/*** Return a copy of the current thread's context map. Returned value may be* null.*/public Map getCopyOfContextMap() {lastOperation.set(READ_OPERATION);Map<String, String> hashMap = copyOnInheritThreadLocal.get();if (hashMap == null) {return null;} else {return new HashMap<String, String>(hashMap);}}

該方法會把當前線程的context制作一份副本返回。

ExecutorService.execute(new Runnable())的時候,在Runnable構造的時候,用這個方法得到一個Map,保存起來,這時的context是父線程的。

然后在執行run方法的時候,放到MDC中去——子線程的context map中去。

可以自己封裝一個AbstractRunnable類,對Runnable的run方法進行一個包裝,

public abstract class MdcRunnable implements Runnable {/*** 為了線程池中的線程在復用的時候也能獲得父線程的MDC中的信息,* 子線程第一次初始化的時候沒事,因為通過InheritableThreadLocal* 已經可以獲得MDC中的內容了*/private final Map mdcContext = MDC.getCopyOfContextMap();@Overridepublic final void run() {// 線程重用的時候,把父線程中的context map內容帶入當前線程的context map中,// 因為線程已經初始化過了,不會像初始化時那樣通過拷貝父線程inheritableThreadLocals到子線程// 的inheritableThreadLocals操作來完成線程間context map的傳遞。// 真正執行到這個run方法的時候,已經到了子線程中了,所以要在初始化的時候用// MDC.getCopyOfContextMap()來獲得父線程contest map,那時候還在父線程域中if (mdcContext != null) {MDC.setContextMap(mdcContext);}try {runWithMdc();} finally {MDC.clear();}}protected abstract void runWithMdc(); }


?

用戶真正需要實現的執行任務的方法是runWithMdc方法。

總結

以上是生活随笔為你收集整理的log(四)——MDC使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。