java自定義線程名稱


問題:我們看線上業務日志 和 查看jstack文件時 線程的名字經常的序號導致很難區分是哪一個線程,這個線程都在干什么

比如舉例1: 下面這個業務log日志,根據線程名字不知道這是哪個線程類

如果是線程池的話,看到所有的線程都是以 pool- 開頭的,那是因為人家就是寫死的。如果要修改線程名字,那么我們自定義線程工廠

public static ThreadPoolExecutor executPool = new ThreadPoolExecutor(50, 200, 60, TimeUnit.SECONDS, 
            new ArrayBlockingQueue<Runnable>(5000),
            new ThreadFactory(){ public Thread newThread(Runnable r) {
                return new Thread(r, "t_pl_pool_" + r.hashCode());
            }},
            new ThreadPoolExecutor.DiscardOldestPolicy());
}

對於非線程池 ,自定義線程 還有一種方法,就是線程在start后才會執行run方法,run方法的執行表示這個task真正被線程運行了,這時線程的名稱也就確定了。所以可以在run的第一句加上 Thread.currentThread().setName("xxxxxx"); 代碼如下:

public class UpdateVertionCheckThread implements extends Thread{
...
    @Override
    public void run() throws Exception {
        Thread.currentThread().setName("UpdateVertionCheckThread");
        logger.info("VertionScheduler update start");
     ...
   );
}

下面我們看下自定義線程  改造后的 日志信息情況

 

同樣對於jstack文件也是,里面的打印全部 運行棧的信息,相應線程也是自定義后的名稱,很方便知道每一個線程是哪一個線程,在干什么。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM