問題:我們看線上業務日志 和 查看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文件也是,里面的打印全部 運行棧的信息,相應線程也是自定義后的名稱,很方便知道每一個線程是哪一個線程,在干什么。